【问题标题】:Can't find the Symbol Table(Elf format) (C programming)找不到符号表(Elf 格式)(C 编程)
【发布时间】:2017-02-25 15:25:06
【问题描述】:

我实际上是在重新编写 nmobjdump 程序。我已经完成了 objdump 并且效果很好,所以我现在正在研究 nm。 我试图找到 符号表,为了做到这一点,我像这样遍历 Section header table

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 是如何工作的

感谢您的帮助:)

【问题讨论】:

  • 我实际上用 void * 中的 Ehdr 替换了数据指针,仍然无法正常工作

标签: c elf objdump nm


【解决方案1】:

我不知道我做得对不对

这个:

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

.e_shoff 添加到void* 指针,从而调用undefined behavior

但是,GCC treats arithmeticvoid* 就像它是一个 char*,所以上面的代码应该仍然产生正确的结果iff你用 GCC 编译它。

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

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

附:请注意,完全剥离的 ELF 文件根本没有 SYMTAB 部分(执行不需要它)。

【讨论】:

  • 我发现了问题,当我的地址(由 data + shdr[i]._sh_offset 提供)等于我的 shstrtab(这不是 ELF 文件的结尾)时,我正在退出我的函数.但是感谢关于 void * 的提示 :)
  • @Drumz "i was exiting my function" -- 这就是为什么您应该始终尝试提供一个完整的最小示例 (stackoverflow.com/help/mcve) -- 问题不在您显示的代码中,所以没人能猜到它在哪里。
猜你喜欢
  • 2017-08-30
  • 2012-08-28
  • 1970-01-01
  • 2015-01-13
  • 2015-12-20
  • 2013-09-18
  • 1970-01-01
  • 2020-11-09
  • 2015-11-12
相关资源
最近更新 更多