我正在與NASM
一起學習大學課程。 我想鏈接C運行時庫與ld
,但我似乎無法繞過它。我有一臺安裝了Linux Mint
的64 bit
機器。如何將C運行時庫與'ld'鏈接?
我感到困惑的原因是 - 據我所知 - 而不是鏈接C運行時,gcc
將您需要的東西複製到您的程序中。我可能是錯的,所以請毫不猶豫地糾正我。
我到目前爲止所做的是,使用gcc
鏈接它。這會產生一個我無法遵循的機器代碼,即使對於像rax
和rbx
這樣的小程序,這對於學習目的來說也不是很好。 (請注意,程序工作。)
我不知道,如果是相關的,但這些都是我使用編譯命令和鏈接:
# compilation
nasm -f elf64 swap.asm
# gcc
gcc -o swap swap.o
# ld, no c runtime
ld -s -o swap swap.o
預先感謝您!
結論:
現在,我有一個正確答案的問題,這裏是我想提幾件事情。動態鏈接glibc
可以像Z boson的答案(對於64位系統)那樣完成。如果你想靜態地做,do follow this link(我從Z玻色子的答案重新張貼)。
這是Jester已發佈,約how programs start in linux的文章。
要查看gcc
如何鏈接您的.o
-s,請嘗試此命令:gcc -v -o swap swap.o
。請注意'v'代表'verbose'。
另外,you should read this如果你有興趣在64位程序集。
感謝你爲您的答案和有益的見解!講話結束。
簡答:不。不幸的是,libc不僅包含動態庫,還包含一些初始化和關閉所需的靜態對象。如果你真的想這樣做,請使用'gcc -v'來查看所需的部件。你可能對這篇關於程序啓動的文章感興趣(http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html)。 – Jester
'gcc -o swap swap.o'鏈接運行時。 'ld -o swap swap.o'沒有。鏈接包括將運行時的大部分內容複製到可執行文件。究竟是什麼問題? –
@Jester我現在就來看看吧! – mrDudePerson