ld(1) GNU Development Tools ld(1)

ld - GNU linker (聯結器)

總覽 (SYNOPSIS)

[-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]

描述 (DESCRIPTION)

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 執行 多種 操作.

選項 (OPTIONS)

過於豐富的 命令列選項 使人 感到 壓抑, 好在 實際使用 中, 多數情況下 只需要 掌握 其中 一小部分. 例如, 在 一個 標準的, 提供 相應支援 的 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'.

選項的引數 必須 出現在 代表 選項 的 字母 後面, 可以有 空白符, 也可以 沒有.

在 目前版本 的 ld 中, 這個 選項 僅適用於 Intel 960 體系系列. 在 ld 的 設定 中, architecture 引數 是 960 系列 的 成員 識別名稱 之一, 由 兩個字母 組成; 這個選項 指出 期望的 輸出目標, 對 輸入檔案 的 不相容指令 作出 警告. 它 能夠 改變 linker 對 庫檔案 的 搜尋策略, 以便於 支援 體系相關庫, 方法是 把 體系識別名稱 新增在 待搜尋 的 檔名 尾部.

例如, 如果 ld 命令列 有 `-ACA' 和 `-ltry', linker 將 搜尋 (根據 內建的路徑 和 -L 指定的路徑) 以下 名稱 的 庫檔案

try
libtry.a
tryca
libtryca.a

前兩項 是 常規做法; 後兩項 源於 `-ACA'.

將來發布的 ld 可能 對 其他 體系結構 提供 類似功能.

可以 在 命令列上 使用 多個 -A 選項, 只要 該 體系 允許 和 目標體系 相連, 其選項 使 ld 在 搜尋 -l 指定的庫 中, 增加 和 體系結構名稱 對應的庫.

指定 輸入目標檔案 的 二進位制格式, 目標檔案 在 命令列 上 給出, 放在 這個選項 的 後面. 一般 不需要 指定 這個選項, ld 的 預設輸入格式 配置為 各個機器 上 最常用 的 格式. input-format 是 字串, BFD 庫 支援的 格式 名稱. 選項 -format input-format 起 相同的 作用, 指令碼命令 TARGET 也是 一樣.

連線 某些 不尋常的 二進位制檔案 時 需要 這個選項. 或者 使用 -b 選項 強調 格式切換 (連線 不同格式 的 目標檔案), 比如說, 在 每組 特定格式 的 目標檔案 前面 使用 -b input-format 選項.

環境變數 GNUTARGET 用於 指定 預設格式. 也可以 在 指令碼檔案 中 用 TARGET 命令 定義 輸入格式.

禁止 連線 共享庫. 這個選項 只在 支援 共享庫 的 平臺 上 有意義.
連線 動態庫. 這個選項 只在 支援 共享庫 的 平臺 上 有意義, 一般說來 它 是 預設選項.
當 建立 共享庫 的 時候, 只要 有可能, 在 共享庫 內 編聯(bind reference) 全域性符號 和 定義(definition). 一般說來, 允許 連線了 某個 共享庫 的 程式 覆蓋 共享庫內 的 定義. 這個選項 只在 支援 共享庫 的 ELF 平臺 上 有意義.
告訴 ld 從 檔案 commandfile 中 讀取 連線 命令. 這些 命令 徹底的 覆蓋 ld 的 預設 連線 格式 (而不是 新增); commandfile 必須 詳盡的 描述 目標格式 的 所有細節.

你 也可以 在 命令列 上 直接嵌入 連線命令, 把 指令碼 嵌在 大括弧 `{' 和 `}' 中間.

輸出 交叉引用表(cross reference). 如果 建立了 連線映像(linker map) 檔案, 交叉引用表 就 輸出到 映像檔案 中, 否則 送往 標準輸出.
這 三個選項 是 一回事, 為了 相容 其他 linker 而 同時提供. 即使 已經 指定 ld 生成 可重定位檔案 (-r), 它們 能為 公共符號(common symbol) 分配 空間. 指令碼命令 FORCE_COMMON_ALLOCATION 起 同樣作用.
在 輸出檔案 中 建立 一個 全域性符號, 它 含有 expression 給出的 絕對地址. 可以 在 命令列 使用 多個 這樣的 選項. 這個 expression 只能 使用 有限的 數學形式: 十六進位制常數, 已經存在 的 符號名字. 或者 使用 +- 加減 十六進位制常數 或 符號. 如果 需要 更復雜的 表示式, 考慮 使用 命令語言指令碼.
這些選項 控制 是否在 出錯資訊 和 其他資訊 中, 輸出 可讀的(demangle) 符號名稱. 如果 使用了 demangle 選項, linker 儘量使 符號名稱 容易理解: 去掉 領頭的 下劃線 (如果 被 目標檔案格式 採用); 把 C++ 難懂的 符號名稱 (symbol name) 轉換成 可讀的 名稱. 預設情況下 linker 輸出 可讀的 符號名稱, 除非 設定了 環境變數 COLLECT_NO_DEMANGLE . 這些選項 能夠 覆蓋 預設行為.
使用 entry (入口) 識別符號 作為 程式 執行 的 開始端, 而不是 預設入口. 關於 預設入口 和 其他 設定 入口 的 方法 參見 `info' 的 ld' 項.
這個選項 僅用於 連線 MIPS上 嵌入的 PIC 程式碼, GNU 的 編譯器 和 彙編器 用 -membedded-pic 選項 能夠 生成 這種程式碼. 它使 linker 建立 一張 表格, 用於 在 執行的時候, 重定位 任何 被 靜態初始化 為 指標值 的 資料. 詳見 testsuite/ld-empic 的 程式碼.
當 建立 ELF 檔案 時, 把 所有 符號 加入 動態符號表. 一般說來, 動態符號表 只包含 動態目標庫(dynamic object) 需要的 符號. 用 dlopen 的 時候 需要 這個 選項.
建立 ELF 共享目標庫 時, 把 內部的 DT_AUXILIARY 欄位 設定為 name. 它 告訴 動態linker, 把 該 共享目標庫 的 符號表 用做 共享目標 name 的 符號表 的 輔助過濾器.
建立 ELF 共享目標庫 時, 把 內部的 DT_FILTER 欄位 設定為 name. 它 告訴 動態linker, 把 該 共享目標庫 的 符號表 用做 共享目標 name 的 符號表 的 輔助過濾器.
等同於 -b input-format.
虛設項; 用於 相容 其他 工具.
size . 用於 MIPS ECOFF, 對 其他 目標檔案格式 無效.
建立 ELF 共享目標庫 時, 把 內部的 DT_SONAME 欄位 設定為 name. 如果 某個 可執行檔案 連線了 含有 DT_SONAME 欄位 的 共享目標庫, 當 該程式 執行 時, 動態 linker 試圖 根據 DT_SONAME 欄位 調入 共享的 目標庫, 而 不使用 提供給 linker 的 檔名.
在 標準輸出 顯示 命令列選項 的 摘要, 然後 結束. 這個選項 和 --version 選項 使用了 兩個 短橫線, 不是 一個, 目的是 相容 其他 GNU 程式. 只用 一個 短橫線 的 選項 是為了 相容 其他 linker.
執行 增量連線(incremental link), 等同於 -r 選項.
在 連線檔案 列表 中 增加 歸檔庫檔案 ar. 可以 多次 使用 這個選項. 凡指定 一項 ar , ld 就會 在 路徑列表 中 增加 一項 對 libar.a 的 搜尋.
這個選項 將 路徑 searchdir 新增 到 路徑列表 中去, ld 在 這個 列表 中 搜尋 歸檔庫. 可以 多次 使用 這個選項.

預設的 搜尋路徑集 (不使用 -L 時) 取決於 ld 使用的 模擬模式(emulation) 及其 配置. 在 連線指令碼 中, 可以 用 SEARCH_DIR 命令 指定 路徑.

在 標準輸出 顯示 連線映像 — 有關 ld 把 符號 對映到 何處 的 診斷資訊, 以及 全域性公共儲存器 的 分配 資訊.
mapfile 檔案 中 — 有關 ld 把 符號 對映到 何處 的 診斷資訊, 以及 全域性公共儲存器 的 分配 資訊.
emulation 聯結器. 可以 用 --verbose-V 選項 列出 有效的 模擬項. 這個選項 覆蓋 編譯 進去 的 預設項.
指定 可讀寫 的 正文資料 節(section). 如果 輸出格式 支援 Unix 風格的 幻數(magic number), 則 輸出檔案 標記為 OMAGIC.

當 使用 `-N' 選項 時, linker 不做 資料段 的 頁對齊(page-align).

設定 正文段 為 只讀, 如果 有可能, NMAGIC 為 可寫.
一般說來, 如果 連線的 時候 發生 錯誤, linker 不會 產生 輸出檔案. 使用了 這個 標誌選項, 只要 不出 致命差錯, 仍能夠 產生 輸出檔案.
linker 通常 犧牲 記憶體, 最佳化 速度, 它 把 輸入檔案 的 符號表 緩衝在 記憶體中. 這個選項 使 linker 必要時 重複讀取 符號表, 以便 最佳化 記憶體使用. 連線 大型 可執行檔案 的 時候, linker 有可能 記憶體 不夠, 此時 可以 試試 這個選項.
一般情況下, 如果 試圖 連線 某些 不匹配 的 輸入檔案, 比如說, 按 不同 處理器 編譯 的, 或者 具有 不同的 位元組順序(endianness), linker 就會 報錯. 這個選項 告訴 linker 默許 這種 錯誤. 要 小心使用 這個選項, 除非 你 正在做 某些 特殊 操作, 而且 能夠 確定 不需要 linker 報錯.
output 用來 指定 ld 生成的 程式名; 如果 沒有 使用 這個選項, 預設名字 是 `a.out'. 指令碼命令 OUTPUT 起 同樣 作用.
生成 最佳化的 輸出檔案. 這個選項 佔用 比較多 的 時間, 因此 僅 常用於 最終檔案 的 生成. level 是 數值引數. 任何 大於零 的 引數 意味著 要求 最佳化.
指定 輸出目標檔案 的 二進位制格式. 一般 不需要 指定 這個選項, ld 的 預設 輸出格式 配置為 各個機器 上 最常用 的 格式. output-format 是 一個 字串, BFD 庫 支援的 格式 名稱. 指令碼命令 OUTPUT_FORMAT 也可以 指定 輸出格式, 但是 這個選項 能夠 覆蓋 掉 它.
從 檔案 filename 中 讀取 符號名稱 及其 地址, 但是 不做 重定位, 不傳送到 輸出端. 它 可以 使 輸出檔案 符號引用 其他程式中 定義的 絕對地址.
這個選項 的 效果 取決於 機器, 目前 只支援 H8/300.

在 某些 平臺 上 可以 使用 這個選項 做 全域性最佳化, 它 讓 linker 解決 程式中 的 地址處理, 例如 在 輸出目標檔案 中 緩和(relax) 地址模式 以及 合成 (synthesize) 新指令.

其他平臺 也接受 `-relax' 選項, 但是 不起作用.

生成 可重定位 輸出 — 就是說, 生成的 輸出檔案 能夠 依次 成為 ld 的 輸入, 一般 稱之為 不完全(partial) 連線. 它 有 一個 副效應, 在 支援 標準 Unix 幻數(magic number) 的 環境 中, 這個選項 把 輸出檔案 的 幻數 設定成 OMAGIC. 如果 沒有 指定 這個選項, linker 生成 絕對定位 的 檔案. 連線 C++ 程式時, 這個選項 不會 解析 出 對 構造子(constructor) 的 引用(reference); 不妨 改用 -Ur 選項.

這個選項 的 效果 和 -i 一樣.

增加 一條 對 執行時(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 選項.

使用 ELF 或 SunOS 的 時候, 某些 共享庫 可能 需要 其他 共享庫. 這種情況 一般 發生在 某個 ld -shared 連線 中, 輸入檔案 包含了 共享庫.

如果 linker 遇到 這樣的 依賴情況, 當 它 執行 非共享, 不可重定位 的 連線 時, linker 將 自動 尋找 所需的 共享庫, 如果 它們 沒有 被 顯明 包含, 就 把 它們 包含到 連線 中. 在 這種情況下, -rpath-link 選項 指定了 最先 搜尋 的 目錄集. -rpath-link 能夠 指定 一批 目錄, 目錄 用 冒號 隔開. 也可以 用 這些 目錄名 作為 引數, 重複 使用 這個 選項.

如果 沒有 找到 需要的 共享庫, linker 產生 一個 警告, 但是 繼續 連線.

去掉 輸出檔案 中的 除錯符號資訊 (但不是 所有符號).
去掉 輸出檔案 中的 全部 符號資訊.
建立 一個 共享庫. 目前 只支援 ELF 和 SunOS 平臺 (在 SunOS 上, 這個選項 不是 必須的, 如果 沒有 使用 -e 選項, 而且 存在 不確定 的 符號, linker 將 自動 建立 共享庫).
ld 通常 把 全域性公共符號 放到 適當的 輸出節, 按照 大小 排序. 首先是 單位元組符號, 然後是 雙位元組, 接下來是 四位元組, 隨後是 其他的. 它的 目的是 防止 符號間 因為 排布限制 出現 間隙. 使用 這個選項 可以 禁止 排序.
在 輸出檔案 中 建立 附加節(extra section), 使得 輸出檔案 中, 沒有 某一個 輸出節 包含 大於 count 個 重定位項. 它 用於 產生 大型 可重定位 COFF 目標檔案, 可以 插入到 某些 實時核心 中; 因為 COFF 不能 在 單一節內 存放 65535 以上的 重定位項. 注意, 有些 目標檔案格式 不支援 任意 分節, 此時 這個選項 將會 操作 失敗. 此外, linker 不能夠 分割 輸入節, 然後 重新分配, 因此 如果 某個 輸入節 包含 count 以上的 重定位項, 相應的 輸出節 將 包含 同樣多的 重定位項.
類似於 -split-by-reloc , 但是 它為 每個 輸入檔案 建立一個 新的 輸出節.
作為 輸出檔案 的 段 起始地址 — 特別是 — bss, data, 或 text 段. org 必須是 十六進位制整數.
等同於 -c commandfile; 用於 相容 其他工具.
ld 處理 輸入檔案 的 時候 顯示 檔名.
sym 作為 未定義(undefined) 的 符號 送入 輸出檔案. 這樣做 可以, 例如, 促使 linker 從 標準庫 連線 某個 附加的模組. 允許 使用 多個 -u 選項 輸入 多個 未定義 符號.
對於 除 C++ 以外的 任何 程式, 這個選項 等同於 -r: 生成 可重定位 的 輸出 — 就是說, 能夠 依次 輸入 ld 的 輸出檔案. 連線 C++ 程式 的 時候, -Ur 解析 對 構造子(constructor) 的 引用(reference), 這一點 和 -r 不同.
顯示 ld 的 版本號, 列出 支援的 模擬項(emulation). 顯示 哪些 輸入檔案 能夠 開啟, 哪些 不能,
顯示 ld 的 版本號. 此外 -V 選項 能夠 列出 支援的 模擬項.
顯示 ld 的 版本號 然後 結束.
當 公共符號 和 其他 公共符號 合併 時, 或者 和 某個 符號定義 合併 時, linker 就發出 警告. Unix 系統的 linker 允許 這種 有些 草率 的 做法, 其他 作業系統 則 不行. 這個選項 幫助你 在 合併 全域性符號 的 時候 發現 潛在問題.
如果 使用了 全域性構造子(global constructor), linker 就發出 警告. 它 只對 某些 目標檔案結構 有用, 對於 如 COFF 或 ELF, 此 linker 不能夠 檢測 全域性構造子 的 使用情況.
如果 輸出檔案 需要 多個 全域性指標值, linker 就發出 警告. 這個選項 只能 用於 某些 處理器, 如 Alpha.
對 每個 未定義符號 只 警告 一次, 而不是 每次 引用 這個符號 都 警告.
如果 某個 輸出節(section) 的 地址 因為 邊界對齊 而 發生 改變, linker 就發出 警告. 典型情況下 由 輸入節 設定 邊界, 只有 不做 明確指定 的 時候 地址 才會 改變; 就是說, SECTIONS 命令 沒有 指出 該節 的 開始地址.
對於 命令列 上 --whole-archive 選項 提到的 每個 歸檔庫, 連線時 連入 歸檔庫 的 全部 目標檔案, 而不是 在 歸檔庫 中 搜尋 所需的 目標檔案. 一般用於 把 歸檔庫檔案 轉變成 共享庫檔案, 迫使 全部 目標檔案 進入 共享庫.
關閉 --whole-archive 選項 對 歸檔庫 的 影響.
symbol 使用 包裝函式(wrapper function). 任何 對 symbol 未定義 的 引用 (undefined reference) 將 解析為 __wrap_symbol. 任何 對 __real_symbol 未定義 的 引用 將 解析為 symbol.
刪除 全部 臨時的 區域性符號. 大多數 目的檔案 中, 這些 區域性符號 的 名字 用 `L' 做 開頭.
刪除 全部 區域性符號.

環境 (ENVIRONMENT)

透過 環境變數 GNUTARGET 可以 改變 ld 的 行為.

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

另見 (SEE ALSO)

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 第一版

《中國Linux論壇man手冊頁翻譯計劃》

http://cmpp.linuxforum.net

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

17 August 1992 cygnus support