跳至內容

連結器

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
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暫存器值。