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)結合在一起,生成一個最終的可執行檔案或庫。具體功能包括:
-
符號解析:解析並匹配目標檔案中的符號(如函式和變數),確保每個符號的引用都有對應的定義。
-
地址重定位:將相對地址轉換為絕對地址,使得程式在執行時可以正確訪問記憶體位置。
-
段合併:將多個目標檔案中的相同型別的段(如程式碼段、資料段)合併到一起。
-
處理庫檔案:將所需的靜態庫或動態庫檔案包含到最終的可執行檔案中。
示例
假設你有兩個目標檔案 main.o
和 utils.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
)。
使用 gcc
或 g++
進行連結
儘管可以直接使用 ld
進行連結,但更常見的做法是透過編譯器(如 gcc
或 g++
)來進行編譯和連結,因為它們會自動處理很多細節。例如:
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 系統的早期歷史,並延續至今。連結器在編譯過程中起著至關重要的作用,它將多個目標檔案和庫檔案連線在一起,生成最終的可執行檔案或庫檔案。