Binary
ELF .data 部分中的符號表
我試圖了解符號表與 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
它列出了
.data
ELF 文件部分中的符號。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
表明.symtab
ELF 中有一個專門的部分用於保存該符號。該
.data
部分是否需要實際的符號表。第一個範例指出該data
部分中有一個,但它不應該只執行二進制值嗎?通過檢查
hexdump
,我只能檢測到一個條目,所以要麼我的概念錯了,要麼其中一些在撒謊。:)
該
.data
部分包含數據本身,即int
包含值 5的四個字節。該.symtab
部分包含符號,即賦予二進製文件各個部分的名稱;var_global_init
符號名稱指向該節中的四個儲存字節.data
。這就是為什麼您只能看到一個條目:符號表中只有一個符號。但是,如果您想從名稱轉到值,則確實需要這兩個部分:符號表告訴您在哪裡可以找到與
var_global_init
符號對應的值,而數據部分包含該值的儲存。