找不到符号表(Elf格式)(C编程)

时间:2017-02-25 15:25:07

标签: c elf objdump nm

我实际上正在重新编码 nm objdump 程序。我已经完成了 objdump 并且效果很好,所以我现在正在研究 nm 。 我正在尝试找到符号表,为了做到这一点,我会像这样运行节头表

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 工作正常),或者我不明白 nm 是如何工作的< / p>

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

  

我不知道我做得对吗

此:

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

.e_shoff添加到void*指针,该指针会调用undefined behavior

但是,void*上的GCC treats arithmetic好像是char*,所以上面的代码仍然会产生正确的结果 iff 你用GCC编译它。

您的第一步应该是运行SHT_SYMTAB来验证您尝试在上运行程序的文件是否 readelf -WS /path/to/file部分。

假设确实如此,您的第二步应该是(在调试器中,或通过打印shdrdata)验证您计算的shdr匹配Start of section headers已打印readelf -h /path/to/file

P.S。请注意,完全剥离的ELF文件根本没有SYMTAB部分(执行时不需要)。