溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux常用命令ld怎么用

發(fā)布時(shí)間:2022-02-17 09:29:50 來源:億速云 閱讀:413 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“Linux常用命令ld怎么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux常用命令ld怎么用”這篇文章吧。

Linux常用命令ld 命令是二進(jìn)制工具集 GNU Binutils 的一員,是 GNU 鏈接器,用于將目標(biāo)文件與庫鏈接為可執(zhí)行文件或庫文件

Linux常用命令ld怎么用

命令格式

 ld [OPTIONS] OBJFILES

選項(xiàng)說明

ld 命令支持眾多鏈接選項(xiàng),但是大部分選項(xiàng)很少被使用,下面是 GNU ld 命令接受的選項(xiàng)。

 -b  指定目標(biāo)代碼輸入文件的格式
 -Bstatic
  只使用靜態(tài)庫
 -Bdynamic
  只使用動(dòng)態(tài)庫
 -Bsymbolic
  把引用捆綁到共享庫中的全局符號
 -c, --mri-script=  為與 MRI 鏈接器兼容,ld 接受由 MRI 命令語言編寫的腳本文件
 --cref
  創(chuàng)建跨引用表
 -d,-dc,-dp
  即使指定了可重定位的輸出文件(使用-r),也會(huì)為公共符號分配空間。腳本命令“FORCE_COMMON_ALLOCATION”具有相同的效果
 -defsym
  在輸出文件中創(chuàng)建指定的全局符號
 -demangle
  在錯(cuò)誤消息中還原符號名稱
 -e  使用指定的符號作為程序的初始執(zhí)行點(diǎn)
 -E,--export-dynamic
  對于ELF格式文件,創(chuàng)建動(dòng)態(tài)鏈接的可執(zhí)行文件時(shí),把所有符號添加到動(dòng)態(tài)符號表
 -f, --auxiliary=  對于 ELF 格式共享對象,設(shè)置 DT_AUXILIARY 名稱
 -F, --filter=  對于ELF格式共享對象,設(shè)置 DT_FILTER 名稱。這告訴動(dòng)態(tài)鏈接器,正在創(chuàng)建的共享對象的符號表應(yīng)該用作共享對象名稱的符號表的篩選器。
 -g
  被忽略。用于提供和其他工具的兼容性
 -h
  對于 ELF 格式共享對象,設(shè)置 DT_SONAME 名稱
 -I, -dynamic-linker, --dynamic-linker=  指定動(dòng)態(tài)鏈接器。這僅在生成依賴動(dòng)態(tài)鏈接庫的 ELF 可執(zhí)行文件時(shí)才有意義。默認(rèn)的動(dòng)態(tài)鏈接器通常是正確的,除非您知道正在做什么,否則不要使用該選項(xiàng)。
 -l, --library=  把指定的庫文件添加到要鏈接的文件清單
 -L, --library-path=searchdir
  把指定的路徑添加添加到搜索庫的目錄清單
 -M, --print-map
  顯示鏈接映射,用于診斷目的
 -Map=:
  將鏈接映射輸出到指定的文件
 -m  模擬指定的鏈接器
 -N,--omagic
  指定讀取/寫入文本和數(shù)據(jù)段
 -n,--nmagic
  關(guān)閉節(jié)的頁面對齊,并禁用對共享庫的鏈接。如果輸出格式支持Unix樣式的幻數(shù),則將輸出標(biāo)記為"NMAGIC"
 -noinhibit-exec
  生成輸出文件,即使出現(xiàn)非致命鏈接錯(cuò)誤。通常,如果鏈接器在鏈接過程中遇到錯(cuò)誤,它將不會(huì)生成輸出文件。
 -no-keep-memory
  ld 通常在內(nèi)存中緩存輸入文件的符號表來優(yōu)化內(nèi)存使用速度。此選項(xiàng)告訴 ld 不要緩存符號表。當(dāng)鏈接大型可執(zhí)行文件時(shí),如果ld耗盡內(nèi)存空間,則可能需要使用該選項(xiàng)
 -O  對于非零的優(yōu)化等級,ld將優(yōu)化輸出。此操作會(huì)比較耗時(shí),應(yīng)該在生成最終的結(jié)果時(shí)使用。
 -o, --output=  指定輸出文件的名稱
 -oformat=  指定輸出文件的二進(jìn)制格式
 -R,--just-symbols=  從指定的文件讀取符號名稱和地址
 -r,--relocatable
  生成可重定位的輸出(稱為部分連接)
 -rpath=  把指定的目錄添加到運(yùn)行時(shí)庫搜索路徑
 -rpath-link=  指定搜索運(yùn)行時(shí)共享庫的目錄
 -S,--strip-debug
  忽略來自輸出文件的調(diào)試器符號信息
 -s,--strip-all
  忽略來自輸出文件的所有符號信息
 -shared, -Bshareable
  創(chuàng)建共享庫
 -split-by-file[=size]
  為每個(gè)目標(biāo)文件在輸出文件中創(chuàng)建額外的段大小達(dá)到size。size默認(rèn)為1
 -split-by-reloc[=count]
  按照指定的長度在輸出文件中創(chuàng)建額外的段
 --section-start==  在輸出文件中指定的地址定位指定的段
 -T, --script=  使用 scriptfile 作為鏈接器腳本。此腳本將替換 ld 的默認(rèn)鏈接器腳本(而不是添加到其中),因此腳本必須指定輸出文件所需的所有內(nèi)容。如果當(dāng)前目錄中不存在腳本文件,ld 會(huì)在 -L 選項(xiàng)指定的目錄中查找
 -Ttext=  使用指定的地址作為文本段的起始點(diǎn)
 -Tdata=  使用指定的地址作為數(shù)據(jù)段的起始點(diǎn)
 -Tbss=  使用指定的地址作為bss段的起始點(diǎn)
 -t,--trace
  在處理輸入文件時(shí)顯示它們的名稱
 -u, --undefined=  強(qiáng)制指定符號在輸出文件中作為未定義符號
 -v, -V, --version
  示ld版本號
 -warn-common
  當(dāng)一個(gè)通用符號和另一個(gè)通用符號結(jié)合時(shí)發(fā)出警告
 -warn-constructors
  如果沒有使用任何全局構(gòu)造器,則發(fā)出警告
 -warn-once
  對于每個(gè)未定義的符號只發(fā)出一次警告
 -warn-section-align
  如果為了對齊而改動(dòng)了輸出段地址,則發(fā)出警告
 --whole-archive
  對于指定的存檔文件,在存檔中包含所有文件
 -X, --discard-locals
  刪除所有本地臨時(shí)符號
 -x, --discard-al
  刪除所有本地符號

4.常用示例

(1)鏈接目標(biāo)文件生成可執(zhí)行文件。給定C++目標(biāo)文件test.o與main.o,生成可執(zhí)行文件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

因?yàn)樯梢粋€(gè)C++可執(zhí)行文件,需要依賴很多系統(tǒng)庫和相關(guān)的目標(biāo)文件,比如C語言庫libc.a,所以使用ld進(jìn)行鏈接時(shí),需要注意添加較長的命令選項(xiàng),不然會(huì)報(bào)鏈接錯(cuò)誤。使用g++ -v命令可以查看最后一行collect2使用的命令選項(xiàng),進(jìn)而了解生成可執(zhí)行文所需的相關(guān)依賴。

 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

以上是“Linux常用命令ld怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI