跳至內容

鏈結器

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
An illustration of the linking process. Object files and static libraries are assembled into a new library or executable.

鏈結器(英語:Linker),又譯為連結器鏈接器,是一個程式,將一個或多個由編譯器組譯器生成的目的檔外加,鏈結為一個可執行檔

IBM大型主機比如OS/360英語OS/360上,鏈結器是linkage editor;在Unix-like系統上常用的鏈結器是GNU ld英語GNU linker。目的檔是包括機器碼和鏈結器可用資訊的程式模組。簡單的講,鏈結器的工作就是解析未定義的符號參照,將目的檔中的預留位置替換為符號的位址。鏈結器還要完成程式中各目的檔的位址空間的組織,這可能涉及重定位工作。

大多數現代作業系統都提供動態鏈結靜態鏈結兩種形式。

增量鏈結

增量鏈結(Incremental Linking),是針對大型軟體的原始碼的很小改動就需要花費很長時間全部重新鏈結問題。特別是程式開發時,不可避免地要不斷修改、重新編譯、鏈結、除錯程式,鏈結的耗時大大影響了編程者工作效率。解決辦法是:所有函式不再首尾緊挨著存放在主記憶體位址空間,而是在函式之間加上padding區域作為間隔,為函式添加幾句指令稍微變長留有餘地。只要函式的代碼改動不大,沒有超過原padding所占的空間,鏈結器只需延長該函式自身,這大大提高了鏈結的速度。還可以在可執行檔的整個.text節末尾設定一個較大的padding區域,或者使用.textbss節,用來存放修改後變大很多的函式。為了解決由此帶來的函式入口位址需要重定位,在.text節中增加ILT表(Incremental Linking Table),所有的函式呼叫都是通過間接跳轉(jum)指令實現,因此函式位址改變僅需要修改ILT表。

Visual Studio在Debug模式下具有動態編譯鏈結功能,也即「Edit and Continue」功能。一個函式在Visual Studio中設斷點或單步除錯,這時該函式在.text節中;修改原始碼後繼續執行該函式,Visual Studio會重新編譯該函式並把它載入到.textbss節中的未利用位址空間(原為padding的部分),並修改對該函式呼叫時跳轉所用的ILT表條目以及當前EIP暫存器值。