我实际上是在重新编码nm和objdump程序。我已经完成了objdump并且效果很好,所以我现在正在研究nm。 我正在尝试找到符号表,为此,我像这样运行部分标题表:
while (i < elf->e_shnum)
{
if (shdr[i].sh_type == SHT_SYMTAB)
printf("Symbol table foundn");
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的工作原理
感谢您的帮助:)
我做得对不对
这:
shdr = ((Elf64_Shdr *)(data + elf->e_shoff));
将.e_shoff
添加到void*
指针,该指针调用未定义的行为。
然而,GCC将void*
上的算术视为char*
,所以如果你用GCC编译它,上面的代码仍然应该产生正确的结果。
您的第一步应该是通过运行readelf -WS /path/to/file
来验证您尝试运行程序的文件是否确实具有SHT_SYMTAB
节。
假设确实如此,您的第二步应该是验证(在调试器中,或通过打印shdr
和data
)您计算的shdr
是否与readelf -h /path/to/file
打印Start of section headers
匹配。
附言请注意,完全剥离的 ELF 文件根本没有SYMTAB
部分(执行不需要)。