Binary

ELF .data 部分中的符號表

  • March 25, 2018

我試圖了解符號表與 ELF 中的 .data 部分有何關係。首先是一些我用來作為基礎的假設。

符號是函式或變數的人類可讀(或“寫在源文件中”)表示,它映射到其實際二進制值(CPU 對其進行操作)。

這是一個例子

//simple.c
int var_global_init = 5;

int main(void)
{
 return 0;
}

讓我們建構它並檢查二進製文件:

$ gcc simple.c -o simple
$ objdump -t simple | grep var_global_init
 0000000000201010 g     O .data  0000000000000004              var_global_init

它列出了.dataELF 文件部分中的符號。ELF 文件的第 20 頁 將該部分定義.data為:

這些部分保存有助於程序記憶體映像的初始化數據。

好吧,這樣的搭配。於是我問自己Does this mean that the symbol table is embedded in the .data section?。但這似乎被下面的例子所反駁:

$ readelf -s simple
 Symbol table '.symtab' contains 66 entries:
 ....
 50: 0000000000201010     4 OBJECT  GLOBAL DEFAULT   23 var_global_init

readelf表明.symtabELF 中有一個專門的部分用於保存該符號。

.data部分是否需要實際的符號表。第一個範例指出該data部分中有一個,但它不應該只執行二進制值嗎?

通過檢查hexdump,我只能檢測到一個條目,所以要麼我的概念錯了,要麼其中一些在撒謊。:)

.data部分包含數據本身,int包含值 5的四個字節。該.symtab部分包含符號,賦予二進製文件各個部分的名稱;var_global_init符號名稱指向該節中的四個儲存字節.data

這就是為什麼您只能看到一個條目:符號表中只有一個符號。但是,如果您想從名稱轉到值,則確實需要這兩個部分:符號表告訴您在哪裡可以找到與var_global_init符號對應的值,而數據部分包含該值的儲存。

引用自:https://unix.stackexchange.com/questions/433493