首頁 > 後端開發 > C++ > C 連結如何運作:從目標檔案到執行檔?

C 連結如何運作:從目標檔案到執行檔?

Patricia Arquette
發布: 2024-12-05 18:48:11
原創
961 人瀏覽過

How Does C   Linking Work: From Object Files to Executable?

C 連結在實務上是如何運作的?

在 C 中,連結是組合多個目標檔案(.o 檔案)和函式庫(.a 或 .so 檔案)轉換為單一執行檔(.exe 或 .out)。連結器解析目標檔案和函式庫之間的外部引用,並建立符號表和可執行檔運作所需的其他資訊。

連結是如何發生的?

  1. 編譯:原始碼被編譯成目標檔。每個目標檔案都包含特定函數或模組的編譯程式碼,以及有關該模組中定義和引用的符號(變數、函數、類別)的資訊。
  2. 重定位:期間連結時,連結器執行重定位,這是修改目標檔案中符號位址以符合它們在執行檔中的最終位址的過程。這是必要的,因為當多個目標檔案組合成單一可執行檔時,符號的位址可能會發生變化。
  3. 符號解析:連結器解析物件檔案和函式庫之間的外部參考。當一個符號在一個目標檔案中引用但在另一個目標檔案中定義時,連結器會找到定義並在它們之間建立連結。這確保了可執行檔在運行時可以存取它所需的所有符號。
  4. 輸出產生:解析所有外部引用後,連結器將建立一個可執行文件,其中包含所有來自目標檔案和庫的程式碼和資料。然後可執行檔就可以運行了。

重定位實踐

為了說明重定位的過程,請考慮以下範例:

// a.cpp
int a = 10;
int main() {
  return a;
}
登入後複製
// b.cpp
int b = 20;
登入後複製

當我們編譯a.cpp和b.cpp時,我們得到兩個目標檔:a.o和b.o. a.o 檔包含變數 a的定義,而 b.o 檔案包含變數 b 的定義。

當我們將 a.o 和 b.o 連結在一起時,連結器需要確保 a 和 b 的引用在最終的可執行檔指向正確的位址。這是透過執行重定位來完成的。

在重定位期間,連結器會修改可執行檔中 a 和 b 的位址,以符合它們在記憶體中的最終位址。例如,如果 a 分配在位址 0x1000,b 分配在位址 0x2000,則連結器將修改可執行檔中對 a 的所有引用,使其指向 0x1000,將所有對 b 的引用修改為指向 0x2000。

此程序可確保執行檔在執行時可以正確存取變數 a 和 b。

以上是C 連結如何運作:從目標檔案到執行檔?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板