連結編輯程式(Linkage Editor)或連結器(Linker)是在程式構建過程中用於將多個目的檔(Object Files)合併為一個單一的可執行檔(Executable File)的工具。目的檔是由編譯器從原始程式碼檔編譯而來的,它們包含了程式的機器代碼,但尚未解決外部引用或符號定義之間的關聯。連結器的主要任務是解決這些引用,將程式的各個部分“連結”在一起,生成一個可以由作業系統載入和執行的獨立程式。
連結編輯程式的主要功能
解析符號引用:在程式的不同部分之間可能會互相引用變數或函數,這些引用在編譯時尚未確定最終位址。連結器負責解析這些符號引用,確定它們在可執行檔中的實際地址。
合併目的檔:將所有的目的檔合併為一個單一的可執行檔。這包括合併相同的資料段和程式碼片段,優化存儲佈局。
重定位:由於目的檔在編譯時並不知道最終的記憶體位址,連結器需要對目的檔中的位址引用進行調整,使之適應最終的可執行檔的記憶體佈局。
處理靜態程式庫:連結器還負責處理靜態程式庫(Static Libraries),將程式所需的庫函數代碼合併到最終的可執行檔中。
生成符號表和重定位表:對於需要動態連結的程式,連結器會生成符號表和重定位表,以便在程式運行時由動態連結器使用。
動態連結與靜態連結
靜態連結:在程式編譯時,所有需要的庫函數都會被複製到最終的可執行檔中。這使得可執行檔較大,但不需要在運行時查找庫函數。
動態連結:程式使用的庫函數在程式運行時才被載入。動態連結的程式在編譯時並不包含庫代碼,而是在運行時由動態連結器(運行時連結器)從共用庫中載入所需的函數。這樣可以減小可執行檔的大小,並允許多個程式共用同一份庫代碼。
連結編輯程式是編譯過程的最後一步,它確保了生成的可執行檔能夠正確地被作業系統載入執行,同時管理了程式內部以及程式與外部庫之間的依賴和關係。