GNU鏈結指令碼 11 構建可執行程式

2021-10-18 23:02:40 字數 1232 閱讀 8468

原文:

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等庫檔案...