找不到符号表(Elf 格式)(C 编程)
Posted
技术标签:
【中文标题】找不到符号表(Elf 格式)(C 编程)【英文标题】:Can't find the Symbol Table(Elf format) (C programming) 【发布时间】:2017-02-25 15:25:06 【问题描述】:我实际上是在重新编写 nm 和 objdump 程序。我已经完成了 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
部分。
假设确实如此,您的第二步应该是验证(在调试器中,或通过打印 shdr
和 data
)您计算的 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 编程)的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向ELF 文件格式 ( 程序头数据 | 节区头数据 | 动态符号表 )