2008-12-03 69 views
3

我一直對鏈接器的工作方式感到困惑,並且這是一個難以搜索的主題。ELF和PE的基本鏈接過程如何工作

爲了證明我的問題,並提供一個答案的框架,我會放下我所知道的(或想我知道)爲止。我可能是非常錯誤的。 :)

首先,每個.cpp文件構建成中間文件(.o對於POSIX/ELF和.OBJ爲Win/PE我相信)。該中間文件包含由它構建的.cpp定義的所有符號,並且具有關於需要正確解析哪些外部鏈接的說明。作爲對此的擴展,Posix系統允許您將.o文件合併到一個.a文件中(這看起來沒有什麼比合並更多的東西?這是什麼命令?)。 .lib是Posix .a文件的Win/PE等價物嗎?

接着,將中間文件鏈接在一起,外部依賴解決,你有你的可執行文件。我錯過了任何步驟?

謝謝!

回答

1

這裏的拼圖的幾件:

  • AR(1)用於創建.a文件。它們類似於焦油(1)或zip文件(可能 與索引查找由符號名稱的對象文件)
  • 鏈接器一起復制目標文件(文本,數據,BSS)的部分。對於GNU LD,部分的精確拷貝可以用鏈接腳本(如複製從.o文件名稱中含有「文本」到一個單一的文本部分中的所有部分)控制
  • 鏈接器也做搬遷:修補指令(跳轉和數據加載)與相應的目標地址進行比較,一旦符號的值已知。在某些情況下,這不能在鏈接時完成,因此鏈接器會將.o文件中的重定位記錄複製/調整爲最終的可執行文件。
  • windows .lib有兩個用途:靜態庫(.lib)與.a庫類似。導入庫(.lib)不包含實際的代碼,但只包含符號列表。鏈接器可以解析來自導入庫的符號,但是後來知道它需要將對應的.dll引用到可執行文件中。在Unix/ELF上,.so文件包含代碼和符號表。
+0

良好,即回答了我所有的問題。謝謝! :) – Nayruden 2008-12-03 17:27:30