鏈接器
此條目沒有列出任何參考或來源。 (2019年3月20日) |
鏈接器(英語:Linker),又譯為連結器、鏈接器,是一個程序,將一個或多個由編譯器或匯編器生成的目標文件外加庫,鏈接為一個可執行文件。
在IBM大型主機比如OS/360上,鏈接器是linkage editor;在Unix-like系統上常用的鏈接器是GNU ld。目標文件是包括機器碼和鏈接器可用信息的程序模組。簡單的講,鏈接器的工作就是解析未定義的符號引用,將目標文件中的占位符替換為符號的地址。鏈接器還要完成程序中各目標文件的地址空間的組織,這可能涉及重定位工作。
增量鏈接
增量鏈接(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寄存器值。