Can';t查找符号表(Elf格式)(C编程)

Can';t查找符号表(Elf格式)(C编程),c,elf,objdump,nm,C,Elf,Objdump,Nm,我实际上正在重新编写nm和objdump程序。我已经完成了objdump,它工作得很好,所以我现在正在研究nm。 我试图找到符号表,为了找到它,我通过节标题表运行如下: while (i < elf->e_shnum) { if (shdr[i].sh_type == SHT_SYMTAB) printf("Symbol table found\n"); i++; } 我不知道我是否做得对(即使我的objdump工作得很好),或者我是否不了解nm是如

我实际上正在重新编写nm和objdump程序。我已经完成了objdump,它工作得很好,所以我现在正在研究nm。 我试图找到符号表,为了找到它,我通过节标题表运行如下:

while (i < elf->e_shnum)
{
    if (shdr[i].sh_type == SHT_SYMTAB)
        printf("Symbol table found\n");
    i++;
}
我不知道我是否做得对(即使我的objdump工作得很好),或者我是否不了解nm是如何工作的

谢谢你的帮助:)

我不知道我做得对不对

这:

.e_shoff
添加到
void*
指针,该指针调用

然而,GCC在
void*
上就像它是一个
char*
一样,所以当您使用GCC编译它时,上面的代码仍然应该产生正确的结果

您的第一步应该是通过运行
readelf-WS/path/to/file
来验证您试图运行程序的文件是否实际具有
SHT\u SYMTAB

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


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

我实际上用在void*中铸造的Ehdr替换了数据指针,仍然不工作。我发现了问题,当我的地址(由data+shdr[I]给出)等于我的shstrtab时,我正在退出我的函数(这不是ELF文件的结尾。)但是感谢void*上的提示:@Drumz“我正在退出我的函数”——这就是为什么你应该总是尝试提供一个完整的最小示例()——问题不在你展示的代码中,所以没有人能猜到它在哪里。
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));
shdr = ((Elf64_Shdr *)(data + elf->e_shoff));