2017-02-25 80 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) - - 问题不在你显示的代码中,所以没有人能猜到它在哪里。 –