連結器

連結器

連結器(Linker)是一個程式,將一個或多個由編譯器彙編器生成的目標檔案外加庫連結為一個執行檔。目標檔案是包括機器碼和連結器可用信息的程式模組。簡單的講,連結器的工作就是解析未定義的符號引用,將目標檔案中的占位符替換為符號的地址。連結器還要完成程式中各目標檔案的地址空間的組織,這可能涉及重定位工作。

基本介紹

  • 中文名:連結器
  • 外文名:Linker
  • 模式靜態連結動態連結
  • 性質:解析未定義的符號引用
  • 全稱:連結編輯器
  • 產生:執行檔
簡介,連結器工作步驟,GNU連結器,

簡介

到目前為止我們描述的內容表明,對於源程式任意一行代碼的修改都需要重新編譯和彙編整個程式:全部重新翻譯是對計算資源的嚴重浪費。這種重複對於標準庫程式尤為浪費,因為程式設計師要編譯和彙編那些在定義上幾乎從未改變過的過程。另一種方法是單獨編譯和彙編每個過程,以使得某一行代碼的改變只需要編譯和彙編一個過程。這種方法需要一個新的系統程式,稱為連結編輯器(link editor)或連結器(linker),它把所有獨立彙編的機器語言程式“拼接”在一起。
連結器也稱連結編輯器,它是一個系統程式,把各個獨立彙編的機器語言程式組合起來 並且解決所有未定義的標記,最後生成執行檔。

連結器工作步驟

連結器的工作分3個步驟:
1、將代碼和數據模組象徵性地放入記憶體。
2、決定數據和指令標籤的地址。
3、修補內部和外部引用。
連結器使用每個目標模組中的重定位信息和符號表,來解析所有未定義標籤。這種引用發生在分支指令、跳轉指令和數據定址處,所以這個程式的工作非常像一個編輯器:它尋找所有舊地址並用新地址取代它們:編輯是“連結編輯器”或連結器名字的簡稱。採用連結器的原因是修補代碼比重新編譯和彙編要快得多。
如果所有外部引用都解析完,連結器接著決定每個模組將要占用的記憶體位置。MlIPS在記憶體中為程式和數據分配空間的方式。因為檔案是單獨彙編的,所以彙編器不可能知道該模組的指令和數據相對於其他模組而言將會被放到哪裡。當連結器將一個模組放到記憶體中的時候,所有絕對引用(absolute reference),即與暫存器無關的記憶體地址必須重定位以反映它的真實地址。
連結器產生一個執行檔(executable file),它可以在一台計算機上運行。通常,這個檔案與目標檔案具有相同的格式,但是它不包含未解決的引用。具有部分連結的檔案是可能的,如庫程式,在目標檔案中仍含有未解決的地址。

GNU連結器

GNU的連結器稱為ld,它負責把若干目標檔案與若干庫檔案連結起來,並重定位它們的數據位置。在編譯一個程式時,最後一步就是運行ld命令,通常ld直接由gcc負責調用,對用戶程式設計師透明。ld能接受連結描述檔案的控制,這是一種用連結命令語言(LinkerScript)寫成的控制檔案,用來在連結的整個過程中提供顯式的、全局的控制。ld比其他連結器更有用的地方在於它提供了診斷信息。許多連結器在碰到錯誤的時候立即放棄執行,但ld卻能夠繼續執行,讓程式設計師發現其他的錯誤,或者在某些情況下,產生一個帶有錯誤信息的輸出檔案。
下圖說明了ld的工作內容。對於多源檔案程式,每個源檔案被彙編為目標檔案(Object File),連結器負責把這些目標檔案,以及相關的庫檔案連結到一起,形成執行檔,這就是連結器的作用。
連結器的作用連結器的作用
目標檔案由若干段組成,包括代碼段、數據段和未初始化數據段等。連結時,ld將打破目標檔案由若干段組成,包括代碼段、數據段和未初始化數據段等。連結時,ld將打破目標檔案內部結構,把所有代碼段都提取出來,共同組成最終可執行程式的代碼段;把所有數據段提取出來,組成最終可執行程式的數據段;未初始化的數據段也做同樣操作。

相關詞條

熱門詞條

聯絡我們