C 連結是組合多個目標檔案(.o) 和庫的過程(.a) 到單一執行檔。與將原始程式碼轉換為目標檔案的編譯不同,連結會解析未解析的符號,重新定位位址,並確保最終的可執行檔已準備好執行。
的關鍵功能之一連結是位址重定位。每個目標檔案都包含對外部符號的引用,例如在其他檔案中聲明的函數和資料。在連結過程中,連結器計算這些符號的最終位址,並相應地調整目標檔案的程式碼和資料部分。
目標檔案提供連結器重定位資訊。每個重定位條目包括需要重定位的目標檔案中的位址和目標符號。
連結器從所有目標檔案和庫中讀取重定位條目。它透過在其他輸入檔或庫中尋找未解析的符號的定義來解析它們。然後,它計算所有符號的最終位址並更新重定位條目。
解析所有符號並重定位位址後,連結器將各個目標檔案組合成一個單一執行檔。此可執行檔包含程式在目標平台上執行所需的程式碼和資料。
考慮以下 C 程式:
// main.cpp #include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; }
當此程式是編譯後,它會產生兩個目標檔案:main.o 和 cout.o。目標檔案 main.o 包含 main 函數的程式碼,而 cout.o 包含
在連結期間,連結器從兩個目標檔案中讀取重定位條目。它透過在 cout.o 中尋找 std::cout 的定義來解析對 std::cout 的參考。連結器也會更新 main.o 中的位址引用,使其指向可執行檔中 std::cout 的正確位址。
最終的可執行檔名為 a.out,包含兩個目標檔案的組合程式碼並準備好被執行。
以上是C 連結如何將目標檔案和函式庫合併為可執行檔?的詳細內容。更多資訊請關注PHP中文網其他相關文章!