Arch manual pages

ld(1) GNU Development Tools ld(1)

ld - GNU linker (連接器)

ld
[-o output] objfile...
 
[-Aarchitecture] [-b input-format] [-Bstatic] [-Bdynamic] [-Bsymbolic] [-c commandfile] [--cref] [-d|-dc|-dp]
 
[-defsym symbol = expression] [--demangle] [--no-demangle] [-e entry] [-embedded-relocs] [-E] [-export-dynamic] [-f name] [--auxiliary name] [-F name] [--filter name] [-format input-format] [-g] [-G size ] [-h name] [-soname name] [--help] [-i] [-lar] [-Lsearchdir] [-M] [-Map mapfile] [-m emulation] [-n|-N] [-noinhibit-exec] [-no-keep-memory] [-no-warn-mismatch] [-Olevel] [-oformat output-format] [-R filename] [-relax] [-r|-Ur] [-rpath directory] [-rpath-link directory] [-S] [-s] [-shared] [-sort-common] [-split-by-reloc count] [-split-by-file] [-T commandfile] [-Ttext textorg] [-Tdata dataorg] [-Tbss bssorg] [-t] [-u sym] [-V] [-v] [--verbose] [--version] [-warn-common] [-warn-constructors] [-warn-multiple-gp] [-warn-once] [-warn-section-align] [--whole-archive] [--no-whole-archive] [--wrap symbol] [-X] [-x]

ld 合併 一組 目標文件(object) 和 庫文件(archive), 重定位 數據部分, 構建 符號引用(symbol reference). 一般說來, 編譯 生成 可執行文件 的 最後步驟 就是 調用 ld.
ld 可以讀取 用 連接器命令語言(Linker Command Language) 編寫的 腳本文件, 它 能夠 對 連接過程 提供 精確 和 全面 的 控制. 本 手冊頁 不討論 命令語言; 可參看 `info' 的 `ld' 項, 或者 手冊 ld: the GNU linker , 裏面有 命令語言 的 細節 和 其他 GNU linker 的 內容.
這個版本 的 ld 使用 通用BFD庫 操作 目標文件, ld 能夠 以 多種格式 讀入, 連接 和 輸出 目標文件 —例如 COFF 或 a.out, 能夠 把 不同的格式 連接 在一起, 產生 各種 有效 的 目標文件. 用 `objdump -i' 可以 列出 各種 體系結構 支持 的 格式 列表; 另見 objdump(1).
GNU linker 不僅 靈活 強大, 還能夠 比 其他 linker 提供 更多 的 診斷信息. 很多 linker 只要 碰上 一個錯誤 就 立刻停止 執行; 而 ld 一有可能 仍然 繼續執行, 這樣 容易 定位出 其他錯誤 (某些情況下, 儘管出了錯, 仍然 生成 輸出文件).
GNU linker ld 期望 實現 更廣泛 的 適用範圍, 儘可能 兼容 其他 linker. 通過 命令行 和 環境變量, 用戶 可以 用 ld 執行 多種 操作.

過於豐富的 命令行選項 使人 感到 壓抑, 好在 實際使用 中, 多數情況下 只需要 掌握 其中 一小部分. 例如, 在 一個 標準的, 提供 相應支持 的 Unix 系統 中, 常常 用 ld 連接 標準的 Unix 目標文件. 如果要 連接 hello.o:
 
$ ld -o output /lib/crt0.o hello.o -lc
 
它 告訴 ld 生成 一個 叫做 output 的 文件 , 其中 連接了 文件 /lib/crt0.ohello.o 以及 庫文件 libc.a (在 標準搜索目錄下).
ld 的 命令行選項 可以 任意順序 出現, 甚至 重複出現. 多數 情況 下, 如果 用 不同的 參數 重複 同一種 選項, ld 不會 出現 更多的變化, 也不會 覆蓋 以前的 參數. (指 命令行 中 左邊的參數)
例外情況 — 某些選項 有 反覆使用 的 需要 — 如 -A, -b (或等同的 -format), -defsym, -L, -l, -R, 和 -u.
待連接的 目標文件 列表, 即 總覽中的 objfile, 可以 放在 命令行選項 的 前面, 後面, 或者 混雜其中; 但是 不能 把 objfile 放置於 某個 選項開關 和 它的參數 中間.
一般說來 linker 要求 至少 輸入 一個 目標文件, 但是 可以 用 -l, -R 輸入 其他格式 的 二進制文件, 或者 用 命令語言 編寫的 腳本文件. 如果 沒有 指定 二進制格式 的 輸入文件, linker 就不能 產生 輸出文件, 而是 顯示 `No input files'.
選項的參數 必須 出現在 代表 選項 的 字母 後面, 可以有 空白符, 也可以 沒有.
-Aarchitecture
在 目前版本 的 ld 中, 這個 選項 僅適用於 Intel 960 體系系列. 在 ld 的 設置 中, architecture 參數 是 960 系列 的 成員 識別名稱 之一, 由 兩個字母 組成; 這個選項 指出 期望的 輸出目標, 對 輸入文件 的 不兼容指令 作出 警告. 它 能夠 改變 linker 對 庫文件 的 搜索策略, 以便於 支持 體系相關庫, 方法是 把 體系識別名稱 添加在 待搜索 的 文件名 尾部.
例如, 如果 ld 命令行 有 `-ACA' 和 `-ltry', linker 將 搜索 (根據 內置的路徑 和 -L 指定的路徑) 以下 名稱 的 庫文件
 
try
 
libtry.a
 
tryca
 
libtryca.a
 
前兩項 是 常規做法; 後兩項 源於 `-ACA'.
將來發布的 ld 可能 對 其他 體系結構 提供 類似功能.
可以 在 命令行上 使用 多個 -A 選項, 只要 該 體系 允許 和 目標體系 相連, 其選項 使 ld 在 搜索 -l 指定的庫 中, 增加 和 體系結構名稱 對應的庫.
-b input-format
指定 輸入目標文件 的 二進制格式, 目標文件 在 命令行 上 給出, 放在 這個選項 的 後面. 一般 不需要 指定 這個選項, ld 的 缺省輸入格式 配置爲 各個機器 上 最常用 的 格式. input-format 是 字符串, BFD 庫 支持的 格式 名稱. 選項 -format input-format 起 相同的 作用, 腳本命令 TARGET 也是 一樣.
連接 某些 不尋常的 二進制文件 時 需要 這個選項. 或者 使用 -b 選項 強調 格式切換 (連接 不同格式 的 目標文件), 比如說, 在 每組 特定格式 的 目標文件 前面 使用 -b input-format 選項.
環境變量 GNUTARGET 用於 指定 缺省格式. 也可以 在 腳本文件 中 用 TARGET 命令 定義 輸入格式.
-Bstatic
禁止 連接 共享庫. 這個選項 只在 支持 共享庫 的 平臺 上 有意義.
-Bdynamic
連接 動態庫. 這個選項 只在 支持 共享庫 的 平臺 上 有意義, 一般說來 它 是 缺省選項.
-Bsymbolic
當 創建 共享庫 的 時候, 只要 有可能, 在 共享庫 內 編聯(bind reference) 全局符號 和 定義(definition). 一般說來, 允許 連接了 某個 共享庫 的 程序 覆蓋 共享庫內 的 定義. 這個選項 只在 支持 共享庫 的 ELF 平臺 上 有意義.
-c commandfile
告訴 ld 從 文件 commandfile 中 讀取 連接 命令. 這些 命令 徹底的 覆蓋 ld 的 缺省 連接 格式 (而不是 添加); commandfile 必須 詳盡的 描述 目標格式 的 所有細節.
你 也可以 在 命令行 上 直接嵌入 連接命令, 把 腳本 嵌在 大括弧 `{ ' 和 `}' 中間.
--cref
輸出 交叉引用表(cross reference). 如果 創建了 連接映像(linker map) 文件, 交叉引用表 就 輸出到 映像文件 中, 否則 送往 標準輸出.
-d
-dc
-dp
這 三個選項 是 一回事, 爲了 兼容 其他 linker 而 同時提供. 即使 已經 指定 ld 生成 可重定位文件 (-r ), 它們 能爲 公共符號(common symbol) 分配 空間. 腳本命令 FORCE_COMMON_ALLOCATION 起 同樣作用.
-defsym symbol = expression
在 輸出文件 中 創建 一個 全局符號, 它 含有 expression 給出的 絕對地址. 可以 在 命令行 使用 多個 這樣的 選項. 這個 expression 只能 使用 有限的 數學形式: 十六進制常數, 已經存在 的 符號名字. 或者 使用 +- 加減 十六進制常數 或 符號. 如果 需要 更復雜的 表達式, 考慮 使用 命令語言腳本.
--demangle
--no-demangle
這些選項 控制 是否在 出錯信息 和 其他信息 中, 輸出 可讀的(demangle) 符號名稱. 如果 使用了 demangle 選項, linker 儘量使 符號名稱 容易理解: 去掉 領頭的 下劃線 (如果 被 目標文件格式 採用); 把 C++ 難懂的 符號名稱 (symbol name) 轉換成 可讀的 名稱. 缺省情況下 linker 輸出 可讀的 符號名稱, 除非 設置了 環境變量 COLLECT_NO_DEMANGLE . 這些選項 能夠 覆蓋 缺省行爲.
-e entry
使用 entry (入口) 標識符 作爲 程序 執行 的 開始端, 而不是 缺省入口. 關於 缺省入口 和 其他 設置 入口 的 方法 參見 `info' 的 ld' 項.
-embedded-relocs
這個選項 僅用於 連接 MIPS上 嵌入的 PIC 代碼, GNU 的 編譯器 和 彙編器 用 -membedded-pic 選項 能夠 生成 這種代碼. 它使 linker 創建 一張 表格, 用於 在 運行的時候, 重定位 任何 被 靜態初始化 爲 指針值 的 數據. 詳見 testsuite/ld-empic 的 代碼.
-E
-export-dynamic
當 創建 ELF 文件 時, 把 所有 符號 加入 動態符號表. 一般說來, 動態符號表 只包含 動態目標庫(dynamic object) 需要的 符號. 用 dlopen 的 時候 需要 這個 選項.
-f name
--auxiliary name
創建 ELF 共享目標庫 時, 把 內部的 DT_AUXILIARY 字段 設置爲 name. 它 告訴 動態linker, 把 該 共享目標庫 的 符號表 用做 共享目標 name 的 符號表 的 輔助過濾器.
-F name
--filter name
創建 ELF 共享目標庫 時, 把 內部的 DT_FILTER 字段 設置爲 name. 它 告訴 動態linker, 把 該 共享目標庫 的 符號表 用做 共享目標 name 的 符號表 的 輔助過濾器.
-format input-format
等同於 -b input-format.
-g
虛設項; 用於 兼容 其他 工具.
-G size把 使用 GP 寄存器 優化的 目標(文件) 大小 限制爲
size . 用於 MIPS ECOFF, 對 其他 目標文件格式 無效.
-h name
-soname name
創建 ELF 共享目標庫 時, 把 內部的 DT_SONAME 字段 設置爲 name. 如果 某個 可執行文件 連接了 含有 DT_SONAME 字段 的 共享目標庫, 當 該程序 運行 時, 動態 linker 試圖 根據 DT_SONAME 字段 調入 共享的 目標庫, 而 不使用 提供給 linker 的 文件名.
--help
在 標準輸出 顯示 命令行選項 的 摘要, 然後 結束. 這個選項 和 --version 選項 使用了 兩個 短橫線, 不是 一個, 目的是 兼容 其他 GNU 程序. 只用 一個 短橫線 的 選項 是爲了 兼容 其他 linker.
-i
執行 增量連接(incremental link), 等同於 -r 選項.
-lar
在 連接文件 列表 中 增加 歸檔庫文件 ar. 可以 多次 使用 這個選項. 凡指定 一項 ar , ld 就會 在 路徑列表 中 增加 一項 對 libar.a 的 搜索.
-Lsearchdir
這個選項 將 路徑 searchdir 添加 到 路徑列表 中去, ld 在 這個 列表 中 搜索 歸檔庫. 可以 多次 使用 這個選項.
缺省的 搜索路徑集 (不使用 -L 時) 取決於 ld 使用的 模擬模式(emulation) 及其 配置. 在 連接腳本 中, 可以 用 SEARCH_DIR 命令 指定 路徑.
-M
在 標準輸出 顯示 連接映像 — 有關 ld 把 符號 映射到 何處 的 診斷信息, 以及 全局公共存儲器 的 分配 信息.
-Map mapfile把 連接映像 輸出到
mapfile 文件 中 — 有關 ld 把 符號 映射到 何處 的 診斷信息, 以及 全局公共存儲器 的 分配 信息.
-m emulation模仿
emulation 連接器. 可以 用 --verbose-V 選項 列出 有效的 模擬項. 這個選項 覆蓋 編譯 進去 的 缺省項.
-N
指定 可讀寫 的 正文數據 節(section). 如果 輸出格式 支持 Unix 風格的 幻數(magic number), 則 輸出文件 標記爲 OMAGIC.
當 使用 `-N' 選項 時, linker 不做 數據段 的 頁對齊(page-align).
-n
設置 正文段 爲 只讀, 如果 有可能, NMAGIC 爲 可寫.
-noinhibit-exec
一般說來, 如果 連接的 時候 發生 錯誤, linker 不會 產生 輸出文件. 使用了 這個 標誌選項, 只要 不出 致命差錯, 仍能夠 產生 輸出文件.
-no-keep-memory
linker 通常 犧牲 內存, 優化 速度, 它 把 輸入文件 的 符號表 緩衝在 內存中. 這個選項 使 linker 必要時 重複讀取 符號表, 以便 優化 內存使用. 連接 大型 可執行文件 的 時候, linker 有可能 內存 不夠, 此時 可以 試試 這個選項.
-no-warn-mismatch
一般情況下, 如果 試圖 連接 某些 不匹配 的 輸入文件, 比如說, 按 不同 處理器 編譯 的, 或者 具有 不同的 字節順序(endianness), linker 就會 報錯. 這個選項 告訴 linker 默許 這種 錯誤. 要 小心使用 這個選項, 除非 你 正在做 某些 特殊 操作, 而且 能夠 確定 不需要 linker 報錯.
-o output
output 用來 指定 ld 生成的 程序名; 如果 沒有 使用 這個選項, 缺省名字 是 `a.out'. 腳本命令 OUTPUT 起 同樣 作用.
-Olevel
生成 優化的 輸出文件. 這個選項 佔用 比較多 的 時間, 因此 僅 常用於 最終文件 的 生成. level 是 數值參數. 任何 大於零 的 參數 意味着 要求 優化.
-oformat output-format
指定 輸出目標文件 的 二進制格式. 一般 不需要 指定 這個選項, ld 的 缺省 輸出格式 配置爲 各個機器 上 最常用 的 格式. output-format 是 一個 字符串, BFD 庫 支持的 格式 名稱. 腳本命令 OUTPUT_FORMAT 也可以 指定 輸出格式, 但是 這個選項 能夠 覆蓋 掉 它.
-R filename
從 文件 filename 中 讀取 符號名稱 及其 地址, 但是 不做 重定位, 不傳送到 輸出端. 它 可以 使 輸出文件 符號引用 其他程序中 定義的 絕對地址.
-relax
這個選項 的 效果 取決於 機器, 目前 只支持 H8/300.
在 某些 平臺 上 可以 使用 這個選項 做 全局優化, 它 讓 linker 解決 程序中 的 地址處理, 例如 在 輸出目標文件 中 緩和(relax) 地址模式 以及 合成 (synthesize) 新指令.
其他平臺 也接受 `-relax' 選項, 但是 不起作用.
-r
生成 可重定位 輸出 — 就是說, 生成的 輸出文件 能夠 依次 成爲 ld 的 輸入, 一般 稱之爲 不完全(partial) 連接. 它 有 一個 副效應, 在 支持 標準 Unix 幻數(magic number) 的 環境 中, 這個選項 把 輸出文件 的 幻數 設置成 OMAGIC. 如果 沒有 指定 這個選項, linker 生成 絕對定位 的 文件. 連接 C++ 程序時, 這個選項 不會 解析 出 對 構造子(constructor) 的 引用(reference); 不妨 改用 -Ur 選項.
這個選項 的 效果 和 -i 一樣.
-rpath directory
增加 一條 對 運行時(runtime)庫 的 搜索路徑. 這個選項 用於 連接 ELF 可執行 文件 和 共享目標庫. 所有 -rpath 選項 的 參數 被 合併, 然後 一起 傳遞 給 運行時 linker, 運行時 linker 在 運行 的 時候 使用 這些 路徑 尋找 共享目標庫. -rpath 也可以 用來 定位 共享目標庫 引用的 共享目標庫; 參見 對 -rpath-link 選項 的 敘述. 如果 連接 ELF 可執行文件 時 沒有 指定 -rpath 選項, linker 就使用 環境變量 LD_RUN_PATH 的 內容 — 只要 這個 環境變量 存在.
-rpath 選項 能夠 用在 SunOS 上, 缺省狀況下, linker 可以 根據 給出的 -L 選項 形成 運行時 搜索路徑. 如果 使用了 -rpath 選項, 運行時 搜索路徑 從 -rpath 中 產生, 而 忽略 -L 選項. 這一點 有利於 使用 gcc, 在 NFS 文件系統 上, gcc 可能 產生 許多 -L 選項.
-rpath-link directory
使用 ELF 或 SunOS 的 時候, 某些 共享庫 可能 需要 其他 共享庫. 這種情況 一般 發生在 某個 ld -shared 連接 中, 輸入文件 包含了 共享庫.
如果 linker 遇到 這樣的 依賴情況, 當 它 執行 非共享, 不可重定位 的 連接 時, linker 將 自動 尋找 所需的 共享庫, 如果 它們 沒有 被 顯明 包含, 就 把 它們 包含到 連接 中. 在 這種情況下, -rpath-link 選項 指定了 最先 搜索 的 目錄集. -rpath-link 能夠 指定 一批 目錄, 目錄 用 冒號 隔開. 也可以 用 這些 目錄名 作爲 參數, 重複 使用 這個 選項.
如果 沒有 找到 需要的 共享庫, linker 產生 一個 警告, 但是 繼續 連接.
-S
去掉 輸出文件 中的 調試符號信息 (但不是 所有符號).
-s
去掉 輸出文件 中的 全部 符號信息.
-shared
創建 一個 共享庫. 目前 只支持 ELF 和 SunOS 平臺 (在 SunOS 上, 這個選項 不是 必須的, 如果 沒有 使用 -e 選項, 而且 存在 不確定 的 符號, linker 將 自動 創建 共享庫).
-sort-common
ld 通常 把 全局公共符號 放到 適當的 輸出節, 按照 大小 排序. 首先是 單字節符號, 然後是 雙字節, 接下來是 四字節, 隨後是 其他的. 它的 目的是 防止 符號間 因爲 排布限制 出現 間隙. 使用 這個選項 可以 禁止 排序.
-split-by-reloc count
在 輸出文件 中 創建 附加節(extra section), 使得 輸出文件 中, 沒有 某一個 輸出節 包含 大於 count 個 重定位項. 它 用於 產生 大型 可重定位 COFF 目標文件, 可以 插入到 某些 實時內核 中; 因爲 COFF 不能 在 單一節內 存放 65535 以上的 重定位項. 注意, 有些 目標文件格式 不支持 任意 分節, 此時 這個選項 將會 操作 失敗. 此外, linker 不能夠 分割 輸入節, 然後 重新分配, 因此 如果 某個 輸入節 包含 count 以上的 重定位項, 相應的 輸出節 將 包含 同樣多的 重定位項.
-split-by-file
類似於 -split-by-reloc , 但是 它爲 每個 輸入文件 建立一個 新的 輸出節.
-Ttext org
org 作爲 輸出文件 的 段 起始地址 — 特別是 — bss, data, 或 text 段. org 必須是 十六進制整數.
-T commandfile
等同於 -c commandfile; 用於 兼容 其他工具.
-t
ld 處理 輸入文件 的 時候 顯示 文件名.
-u sym
sym 作爲 未定義(undefined) 的 符號 送入 輸出文件. 這樣做 可以, 例如, 促使 linker 從 標準庫 連接 某個 附加的模塊. 允許 使用 多個 -u 選項 輸入 多個 未定義 符號.
-Ur
對於 除 C++ 以外的 任何 程序, 這個選項 等同於 -r: 生成 可重定位 的 輸出 — 就是說, 能夠 依次 輸入 ld 的 輸出文件. 連接 C++ 程序 的 時候, -Ur 解析 對 構造子(constructor) 的 引用(reference), 這一點 和 -r 不同.
--verbose
顯示 ld 的 版本號, 列出 支持的 模擬項(emulation). 顯示 哪些 輸入文件 能夠 打開, 哪些 不能,
-v, -V
顯示 ld 的 版本號. 此外 -V 選項 能夠 列出 支持的 模擬項.
--version
顯示 ld 的 版本號 然後 結束.
-warn-common
當 公共符號 和 其他 公共符號 合併 時, 或者 和 某個 符號定義 合併 時, linker 就發出 警告. Unix 系統的 linker 允許 這種 有些 草率 的 做法, 其他 操作系統 則 不行. 這個選項 幫助你 在 合併 全局符號 的 時候 發現 潛在問題.
-warn-constructors
如果 使用了 全局構造子(global constructor), linker 就發出 警告. 它 只對 某些 目標文件結構 有用, 對於 如 COFF 或 ELF, 此 linker 不能夠 檢測 全局構造子 的 使用情況.
-warn-multiple-gp
如果 輸出文件 需要 多個 全局指針值, linker 就發出 警告. 這個選項 只能 用於 某些 處理器, 如 Alpha.
-warn-once
對 每個 未定義符號 只 警告 一次, 而不是 每次 引用 這個符號 都 警告.
-warn-section-align
如果 某個 輸出節(section) 的 地址 因爲 邊界對齊 而 發生 改變, linker 就發出 警告. 典型情況下 由 輸入節 設置 邊界, 只有 不做 明確指定 的 時候 地址 纔會 改變; 就是說, SECTIONS 命令 沒有 指出 該節 的 開始地址.
--whole-archive
對於 命令行 上 --whole-archive 選項 提到的 每個 歸檔庫, 連接時 連入 歸檔庫 的 全部 目標文件, 而不是 在 歸檔庫 中 搜索 所需的 目標文件. 一般用於 把 歸檔庫文件 轉變成 共享庫文件, 迫使 全部 目標文件 進入 共享庫.
--no-whole-archive
關閉 --whole-archive 選項 對 歸檔庫 的 影響.
--wrap symbol
symbol 使用 包裝函數(wrapper function). 任何 對 symbol 未定義 的 引用 (undefined reference) 將 解析爲 __wrap_symbol. 任何 對 __real_symbol 未定義 的 引用 將 解析爲 symbol.
-X
刪除 全部 臨時的 局部符號. 大多數 目的文件 中, 這些 局部符號 的 名字 用 `L ' 做 開頭.
-x
刪除 全部 局部符號.

通過 環境變量 GNUTARGET 可以 改變 ld 的 行爲.
如果 沒有 使用 -b 選項 (或 相同的 -format), GNUTARGET 決定了 輸入文件 的 目標格式, 其值 應爲 BFD的 名稱之一. 如果 沒有 GNUTARGET 環境變量, ld 就使用 主機的 本地格式. 如果 GNUTARGET 設置爲 default, BFD 通過 檢查 輸入文件 的 二進制格式 判斷 輸入格式; 這個方法 通常 有效, 但 隱含 歧義, 這是因爲 沒有 辦法 保證 標誌 目標文件格式 的 幻數 是 唯一的. 不過, 各個系統 配置 BFD 的 時候, 會把 系統 約定的格式 放在 搜索列表 的 前面, 因此 能夠 按照 約定 消除 歧義.

objdump(1)
 
`ld' 和 `binutils' 項 ( info)
 
ld: the GNU linker, Steve Chamberlain and Roland Pesch; The GNU Binary Utilities, Roland H. Pesch.

Copyright (c) 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.

徐明 <xuming@users.sourceforge.net>

2003/05/13 第一版

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
 
中文 man 手冊頁計劃: https://github.com/man-pages-zh/manpages-zh
17 August 1992 cygnus support