2017-02-25 82 views
0

我實際上記錄了nmobjdump程序。我已經完成objdump,它運作良好,所以我現在正在nm上工作。 我試圖找到符號表,爲了做到這一點我通過節頭表像這樣運行:找不到符號表(Elf格式)(C編程)

while (i < elf->e_shnum) 
{ 
    if (shdr[i].sh_type == SHT_SYMTAB) 
     printf("Symbol table found\n"); 
    i++; 
} 

我從來沒有經歷過這種情況下運行,已經嘗試過在我的objdump程序和同樣的問題,找不到SHT_SYMTAB。

這是我應得的節頭表

Elf64_Shdr *shdr; 
unsigned char *shstrtab; 
void   *data; 
Elf64_Ehdr *elf; 

//I reduced the code to make it more readable 
data = mmap(NULL, filesize(fd), PROT_READ, MAP_SHARED, fd, 0); 
elf = ((Elf64_Ehdr *)data); 
shdr = ((Elf64_Shdr *)(data + elf->e_shoff)); 
shstrtab = ((unsigned char *)(data + shdr[elf->e_shstrndx].sh_offset)); 

我不知道如果我這樣做是正確的(即使我objdump的工作完美),或如果我沒有理解納米如何工作

感謝您的幫助:)

+0

我實際上用void *替換了Ehdr中的一個數據指針,但仍然不工作 – Drumz

回答

1

我不知道如果我這樣做是正確

此:

shdr = ((Elf64_Shdr *)(data + elf->e_shoff)); 

增加.e_shoffvoid*指針,它調用undefined behavior

然而,GCC treats arithmeticvoid*就好像它是一個char*,所以上面的代碼應該仍然會產生正確的結果IFF你使用GCC編譯它。

你的第一步應該是驗證文件,你正在嘗試運行您的程序上實際具有運行readelf -WS /path/to/fileSHT_SYMTAB部分(S)。

假設它,第二個步驟應該是驗證(在調試器,或通過印刷shdrdata)該shdr你計算匹配Start of section headers通過readelf -h /path/to/file打印。

P.S.請注意,完全剝離的ELF文件根本沒有SYMTAB部分(不需要執行)。

+0

我發現問題,當我的地址(由data + shdr [i] ._ sh_offset給出)等於我的shstrtab(這不是ELF文件的結尾)。但謝謝你的提示void * :) – Drumz

+1

@Drumz「我正在退出我的功能」 - 這就是爲什麼你應該總是試圖提供一個完整的最小示例(http://stackoverflow.com/help/mcve) - - 問題不在你顯示的代碼中,所以沒有人能猜到它在哪裏。 –