連結器 ld 名稱的由來

Undefined443發表於2024-05-22

Linker 通常縮寫為 LD,這是因為在 Unix 和類 Unix 系統中,ld 是連結器的常用命令名稱。這個命名可以追溯到 Unix 系統的早期發展歷史。

歷史背景

  • Unix 早期:在 Unix 系統的早期版本中,命令列工具的名字通常都很短,以便在命令列介面中快速輸入。這種命名習慣導致了很多工具的名稱只有兩個字母,比如 cc(C 編譯器)、cp(複製檔案)、mv(移動檔案)等。

  • 連結器:在這種命名慣例下,連結器被命名為 ld,這是 "link editor" 的縮寫。ld 意味著它是負責連結和編輯目標檔案的工具,最終生成可執行檔案或庫檔案。

GNU 連結器

在 GNU 工具鏈中,ld 是 GNU 連結器的命令。GNU 連結器是 GNU 專案的一部分,提供了一個強大且靈活的連結器實現,廣泛用於各種 Unix 和類 Unix 系統,包括 Linux。

連結器的作用

連結器(Linker)的主要作用是將編譯器生成的多個目標檔案(object files)和庫檔案(libraries)結合在一起,生成一個最終的可執行檔案或庫。具體功能包括:

  1. 符號解析:解析並匹配目標檔案中的符號(如函式和變數),確保每個符號的引用都有對應的定義。

  2. 地址重定位:將相對地址轉換為絕對地址,使得程式在執行時可以正確訪問記憶體位置。

  3. 段合併:將多個目標檔案中的相同型別的段(如程式碼段、資料段)合併到一起。

  4. 處理庫檔案:將所需的靜態庫或動態庫檔案包含到最終的可執行檔案中。

示例

假設你有兩個目標檔案 main.outils.o,以及一個靜態庫 libmylib.a,你可以使用 ld 命令進行連結:

ld -o myprogram main.o utils.o -L/path/to/lib -lmylib

其中:

  • -o myprogram:指定輸出檔名為 myprogram
  • -L/path/to/lib:指定庫檔案的搜尋路徑。
  • -lmylib:指定要連結的庫(libmylib.a)。

使用 gccg++ 進行連結

儘管可以直接使用 ld 進行連結,但更常見的做法是透過編譯器(如 gccg++)來進行編譯和連結,因為它們會自動處理很多細節。例如:

gcc -o myprogram main.o utils.o -L/path/to/lib -lmylib

或者:

g++ -o myprogram main.o utils.o -L/path/to/lib -lmylib

總結

LD 是連結器的縮寫,這是因為在 Unix 系統中,連結器的命令名被簡短地命名為 ld,代表 "link editor"。這種命名習慣源自 Unix 系統的早期歷史,並延續至今。連結器在編譯過程中起著至關重要的作用,它將多個目標檔案和庫檔案連線在一起,生成最終的可執行檔案或庫檔案。

相關文章