Linux 命令(65) ld 命令

2021-09-17 03:00:52 字數 3790 閱讀 4039

ld 命令是二進位制工具集 gnu binutils 的一員,是 gnu 鏈結器,用於將目標檔案與庫鏈結為可執行檔案或庫檔案。

ld [options] objfiles
ld 命令支援眾多鏈結選項,但是大部分選項很少被使用,下面是 gnu ld 命令接受的選項。

-b 指定目標**輸入檔案的格式

-bstatic

只使用靜態庫

-bdynamic

只使用動態庫

-bsymbolic

把引用**到共享庫中的全域性符號

--cref

建立跨引用表

-d,-dc,-dp

即使指定了可重定位的輸出檔案(使用-r),也會為公共符號分配空間。指令碼命令「force_common_allocation」具有相同的效果

-defsym

在輸出檔案中建立指定的全域性符號

-demangle

在錯誤訊息中還原符號名稱

-e 使用指定的符號作為程式的初始執行點

-e,--export-dynamic

對於elf格式檔案,建立動態鏈結的可執行檔案時,把所有符號新增到動態符號表

-f , --auxiliary=對於 elf 格式共享物件,設定 dt_auxiliary 名稱

-f , --filter=對於elf格式共享物件,設定 dt_filter 名稱。這告訴動態鏈結器,正在建立的共享物件的符號表應該用作共享物件名稱的符號表的篩選器。

-g 被忽略。用於提供和其他工具的相容性

-h 對於 elf 格式共享物件,設定 dt_soname 名稱

-i, -dynamic-linker , --dynamic-linker=指定動態鏈結器。這僅在生成依賴動態鏈結庫的 elf 可執行檔案時才有意義。預設的動態鏈結器通常是正確的,除非您知道正在做什麼,否則不要使用該選項。

-l , --library=把指定的庫檔案新增到要鏈結的檔案清單

-l , --library-path=searchdir

把指定的路徑新增新增到搜尋庫的目錄清單

-m, --print-map

顯示鏈結對映,用於診斷目的

-map=:

將鏈結對映輸出到指定的檔案

-m 模擬指定的鏈結器

-n,--omagic

指定讀取/寫入文字和資料段

-n,--nmagic

關閉節的頁面對齊,並禁用對共享庫的鏈結。如果輸出格式支援unix樣式的幻數,則將輸出標記為"nmagic"

-noinhibit-exec

生成輸出檔案,即使出現非致命鏈結錯誤。通常,如果鏈結器在鏈結過程中遇到錯誤,它將不會生成輸出檔案。

-no-keep-memory

ld 通常在記憶體中快取輸入檔案的符號表來優化記憶體使用速度。此選項告訴 ld 不要快取符號表。當鏈結大型可執行檔案時,如果ld耗盡記憶體空間,則可能需要使用該選項

-o 對於非零的優化等級,ld將優化輸出。此操作會比較耗時,應該在生成最終的結果時使用。

-o , --output=指定輸出檔案的名稱

-oformat=指定輸出檔案的二進位制格式

-r ,--just-symbols=從指定的檔案讀取符號名稱和位址

-r,--relocatable

生成可重定位的輸出(稱為部分連線)

-rpath=把指定的目錄新增到執行時庫搜尋路徑

-rpath-link=指定搜尋執行時共享庫的目錄

-s,--strip-debug

忽略來自輸出檔案的偵錯程式符號資訊

-s,--strip-all

忽略來自輸出檔案的所有符號資訊

-shared, -bshareable

建立共享庫

-split-by-file[=size]

為每個目標檔案在輸出檔案中建立額外的段大小達到size。size預設為1

-split-by-reloc[=count]

按照指定的長度在輸出檔案中建立額外的段

--section-start==在輸出檔案中指定的位址定位指定的段

-t , --script=使用 scriptfile 作為鏈結器指令碼。此指令碼將替換 ld 的預設鏈結器指令碼(而不是新增到其中),因此指令碼必須指定輸出檔案所需的所有內容。如果當前目錄中不存在指令碼檔案,ld 會在 -l 選項指定的目錄中查詢

-ttext=使用指定的位址作為文字段的起始點

-tdata=使用指定的位址作為資料段的起始點

-tbss=使用指定的位址作為bss段的起始點

-t,--trace

在處理輸入檔案時顯示它們的名稱

-u , --undefined=強制指定符號在輸出檔案中作為未定義符號

-v, -v, --version

示ld版本號

-warn-common

當乙個通用符號和另乙個通用符號結合時發出警告

-warn-constructors

如果沒有使用任何全域性構造器,則發出警告

-warn-once

對於每個未定義的符號只發出一次警告

-warn-section-align

如果為了對齊而改動了輸出段位址,則發出警告

--whole-archive

對於指定的存檔檔案,在存檔中包含所有檔案

-x, --discard-locals

刪除所有本地臨時符號

-x, --discard-al

刪除所有本地符號

(1)鏈結目標檔案生成可執行檔案。給定c++目標檔案test.o與main.o,生成可執行檔案test.out。

ld /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o -l/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -l/usr/lib64 -l/usr/lib -lstdc++ -lm -lgcc_s -lc -lgcc  main.o test.o -o test.out
因為生成乙個c++可執行檔案,需要依賴很多系統庫和相關的目標檔案,比如c語言庫libc.a,所以使用ld進行鏈結時,需要注意新增較長的命令選項,不然會報鏈結錯誤。使用g++ -v命令可以檢視最後一行collect2使用的命令選項,進而了解生成可執行文所需的相關依賴。

g++ -v main.o test.o

...usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o -l/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -l/usr/lib64 -l/usr/lib -lstdc++ -lm -lgcc_s -lc -lgcc main.o test.o

[1] ld manual

[2] gnu binutils

[3] 使用ld命令鏈結目標檔案生成可執行檔案

ldd命令 ubuntu Linux命令 ldd

1 ldd不是乙個可執行程式,而是乙個shell指令碼。zlf ubuntu whichldd usr bin ldd zlf ubuntu file usr bin ldd usr bin ldd bourne again shell script,ascii text executable 2 ...

ld命令和鏈結庫

ld命令和鏈結庫 1 靜態連線庫的名稱是有約定的,也就是必須的 以lib開頭,以 a 作為副檔名。所以不可能有名為my.a的靜態庫。如 你的庫可以起名為 libmy.a so 應該是動態連線庫 2 新增靜態連線庫 如果,你生成的libmy.a在 usr local lib裡面 gcc o myexe...

007 鏈結器命令指令碼LD檔案教程(1)

開發人員如何指定乙個二進位制映象檔案的內部布局呢?可以傳遞給鏈結器乙個鏈結描述檔案,也成為鏈結器命令指令碼。可以將這個特殊的檔案看做乙份構造二進位制可執行映象的 配方 下面 中顯示了u boot引導引導程式使用的鏈結器描述檔案的部分內容。該指令碼從這裡開始定義了二進位制elf映象的輸出段。它指示鏈結...