2017-07-30 120 views
1

我讀到,在第一遍中,所有目標代碼的符號表合併成一個單獨的全局表,並且所有的段都使用它們的地址存儲到段表中。鏈接中的符號表

在第二遍中,使用全局符號表和段表進行符號解析。

我的問題是,符號表只包含值,符號名稱和類型條目,那麼在第二遍符號解析期間,鏈接器如何知道全局符號表中每個符號的地址?

回答

2

當在裝配時定義符號時,它被分配了segment:offset。如果它被聲明爲PUBLIC,則它存儲在全局符號表中。

將段鏈接到可執行映像中時,每個段都會獲得其相對虛擬地址的。將偏移量添加到此分段的RVA會給出符號的值。典型的公共符號是圖書館功能的入口。

所以你的問題的答案是:在彙編時由編譯器指定偏移量以及段的名稱。分段地址在鏈接時由鏈接器在一個接一個排序時指定。他們一起產生期望的符號值(地址)。

如果另一個對象代碼引用這個公共符號(調用庫函數),它將被聲明爲EXTERN並且它的值在彙編時不知道,因此它暫時設置爲零,並伴隨着稱爲重新定位的數據結構。 重定位指定此臨時零的地址和外部符號的名稱。鏈接器讀取重定位,找到具有匹配名稱的相應公共符號,然後用公共符號的值替換臨時零。

+0

這部分在哪裏:偏移對存儲在哪裏?我的意思是在哪個表中?這個鏈接https://www.iecc.com/linker/linker01.html表示,全局符號表只是所有局部符號表的組合,而不僅僅是公共變量。 – Zephyr

+0

偏移值和段標識都是符號的屬性。 – vitsoft

+0

編譯器/彙編程序的作者決定他/她將爲每種符號保留單獨的表格,還是最好維護一個大表格並用指定其範圍的標記(PRIVATE/PUBLIC/EXTERN )。在後一種情況下,這樣的表應該被稱爲**符號表**而不是**全局符號表**。 – vitsoft