原文:
1、目標
2、系統庫依賴
我們先開啟標準c庫和部分必要的鏈結。預設gcc
命令編譯產出可執行程式時,會預設指定一組二進位制檔案。使用gcc .... -v
命令可以看到完整的編譯指令。筆者的計算機上,該指令輸出如下。
我們先對該命令中的二進位制檔案做個整理。gcc指定部分引數時,會遮蔽其中部分檔案。**中的x標記表示該引數遮蔽該檔案。如果你直接使用ld命令構建應用程式,那麼任何預設的二進位制檔案均不會連線。
檔案|包|功能|-nostartfiles|-nostdlib|-nodefaultlibs -|-|-|-|-|-|- /usr/lib/x86_64-linux-gnu/scrt1.o|libc6-dev|_start符號|x|x| /usr/lib/x86_64-linux-gnu/crti.o|libc6-dev||x|x| /usr/lib/gcc/x86_64-linux-gnu/6/crtbegins.o|libgcc-6-dev||x|x| loads| /usr/lib/gcc/x86_64-linux-gnu/6/libgcc.a|libgcc-6-dev|||x|x /usr/lib/gcc/x86_64-linux-gnu/6/libgcc_s.so|libgcc-6-dev|||x|x /usr/lib/x86_64-linux-gnu/libc.so|libc6-dev|||x|x /usr/lib/gcc/x86_64-linux-gnu/6/crtends.o |libgcc-6-dev||x|x| /usr/lib/x86_64-linux-gnu/crtn.o|libc6-dev||x|x|
3、構建可執行程式
前面已經分析,由於乙個完整的程式依賴這些檔案。那麼我們只需要按照對應的方式在ld中指定這些檔案即可。鏈結命令如下。
由於我們的可執行程式包含了動態庫依賴,動態庫的rela.plt是ld臨時生成的段,需要明確保留該段。鏈結指令碼如下。該部分測試**位於01目錄。
entry(_start)
sections
. = 0x1000;
.text . :
.data . :
.bss :
_bss_end = (. + 0x20000 - 1) / 0x20000 * 0x20000;
__init_array_start = .;
__init_array_end = .;
/discard/ :
}
GNU鏈結指令碼學習(1)
最簡單的鏈結指令碼只有乙個命令 sections 使用 sections 命令描述輸出檔案記憶體布局。sections 命令是非常強大的,在這我們將解釋它的簡單用法。現在假設你的程式只是由單一 段 初始化數段和未初始化資料段,分別對應 text data bss 的段名。再假設輸入檔案中也只出現這些...
GNU鏈結指令碼 05 符號值分配
原文 1 簡單符號值 第一節已經對符號做了描述,並且提及鏈結指令碼也是符號的產生原因之一。符號支援如下運算。symbol expression symbol expression symbol expression symbol expression symbol expression symbol...
編譯 鏈結和構建
編譯 鏈結和構建 1.編譯的英文是compile,指的是把源 檔案通過編譯器轉化為目標檔案的過程。編譯過程的輸入檔案是c cpp h等文字檔案,輸出是obj目標檔案。2.鏈結的英文是link,它指的是把多個obj目標檔案 lib庫檔案鏈結成乙個可執行檔案的過程。鏈結過程的輸入是obj lib等庫檔案...