我实际上正在重新编码 nm 和 objdump 程序。我已经完成了 objdump 并且效果很好,所以我现在正在研究 nm 。 我正在尝试找到符号表,为了做到这一点,我会像这样运行节头表:
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 是如何工作的< / p>
感谢您的帮助:)
答案 0 :(得分:0)
我不知道我做得对吗
此:
shdr = ((Elf64_Shdr *)(data + elf->e_shoff));
将.e_shoff
添加到void*
指针,该指针会调用undefined behavior。
但是,void*
上的GCC treats arithmetic好像是char*
,所以上面的代码仍然会产生正确的结果 iff 你用GCC编译它。
您的第一步应该是运行SHT_SYMTAB
来验证您尝试在上运行程序的文件是否 readelf -WS /path/to/file
部分。
假设确实如此,您的第二步应该是(在调试器中,或通过打印shdr
和data
)验证您计算的shdr
匹配Start of section headers
已打印readelf -h /path/to/file
。
P.S。请注意,完全剥离的ELF文件根本没有SYMTAB
部分(执行时不需要)。