2011-08-18 27 views
9

我在看解釋ELF可執行文件的動態符號表(.dynsym)。我可以成功地解釋使用「值」屬性來表示符號的地址和「名稱」的符號表的.symtab(針對每個符號16個字節)的屬性來表示字符串的開頭的在.strtab偏移部分。但我無法使用相同的方法來解釋動態符號表(.dynsym)。我用阿里的博客[1]作爲參考。如何解釋ELF可執行文件中的動態符號表?

我看着阿里的[2]的另一個博客,但我不明白是如何使用哈希表來解釋動態符號表。很明顯,這與符號表所使用的映射不同。我應該如何解釋動態符號表(.dynsym)?

另外,我正在看的ELF可執行文件有兩個部分,即.hash的.gnu.hash。我參考了哪些部分的散列值?

[1] http://blogs.oracle.com/ali/entry/inside_elf_symbol_tables
[2] http://blogs.oracle.com/ali/entry/gnu_hash_elf_sections

感謝和問候,
Hrishikesh穆拉利

+0

好的,我已經等了一天的評論/回答,但我沒有得到任何。我得出什麼結論?: -/ –

回答

2

但我無法解釋使用 的動態符號表(顯.dynsym)同樣的方法。

您需要在「.dynstr」部分查找字符串。

另外,我正在看的ELF可執行文件有兩個部分,分別是 即.hash和.gnu.hash。我參考了哪個部分的散列 值?

這取決於你想查找的符號的種類。據我所知, GNU風格哈希表只包含與動態鏈接相關的信息。

另見:Jakub Jelinek的description of GNU hash tables,貼在GNU binutils mailing list上。

3

從ELF說明書中,各符號是使用以下結構定義:

typedef struct { 
     Elf32_Word 
     Elf32_Addr 
     Elf32_Word 
     unsigned char 
     unsigned char 
     Elf32_Half 
} Elf32_Sym; 

所以一般來說,這將是16個字節。動態和靜態符號表使用相同的結構,因此解析此表對於靜態和鏈接來說是相同的。當然,價值的含義並不總是相同的。

您可以通過兩種方式達到在符號表中的符號。首先,如果你已經知道符號索引,你可以去那個索引。但有時候你沒有符號索引,你只有一個符號名稱,實際上你想檢查符號表是否具有該名稱符號的定義。在這第二種情況下,你使用哈希部分。這些用於快速檢查符號表中是否存在符號:symbol-name - > hash - > symb_index - >檢查symbol_table [symb_index] ==符號名稱。

+0

這是不正確的,因爲* Elf32_Half *是2個字節,而不是4,給出:4 + 4 + 4 + 1 + 1 + 2 = 16個字節。另外,值得注意的是,用* ELFCLASS64 *(x86-64),這是24個字節。 – krb686

+0

我相信你是對的。我會糾正的。 – JohnTortugo

相關問題