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



我实际上是在重新编码nmobjdump程序。我已经完成了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节。

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

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

最新更新