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

Posted

技术标签:

【中文标题】找不到符号表(Elf 格式)(C 编程)【英文标题】:Can't find the Symbol Table(Elf format) (C programming) 【发布时间】: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 替换了数据指针,仍然无法正常工作 【参考方案1】:

我不知道我做得对不对

这个:

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

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

但是,GCC treats arithmetic 对 void* 就像它是一个 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" -- 这就是为什么您应该始终尝试提供一个完整的最小示例 (***.com/help/mcve) -- 问题不在您显示的代码中,所以没人能猜到它在哪里。

以上是关于找不到符号表(Elf 格式)(C 编程)的主要内容,如果未能解决你的问题,请参考以下文章

ELF格式解读-符号表

ELF格式文件符号表全解析及readelf命令使用方法

Android 逆向ELF 文件格式 ( 程序头数据 | 节区头数据 | 动态符号表 )

编译链接实战elf符号表

我可以从 ELF 文件的符号表中的符号信息中获取对象名称吗?

二进制安全:ELF文件深度分析Linux二进制代码审计