找不到 Symbol Table(Elf 格式) (C 编程)

Can't find the Symbol Table(Elf format) (C programming)

我实际上正在重新编码 nmobjdump 程序。我已经完成 objdump 并且效果很好,所以我现在正在研究 nm。 我正在尝试找到 符号 table,以便通过 部分 header [=] 运行 table 像这样:

while (i < elf->e_shnum)
{
    if (shdr[i].sh_type == SHT_SYMTAB)
        printf("Symbol table found\n");
    i++;
}

我从来没有 运行 通过这种情况,已经在我的 objdump 程序中尝试过同样的问题,找不到 SHT_SYMTAB。

我就是这样得到 部分 header table :

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 有效

感谢您的帮助:)

I don't know if i'm doing it right

这个:

shdr = ((Elf64_Shdr *)(data + elf->e_shoff));

.e_shoff 添加到 void* 指针,它调用 undefined behavior.

然而,void* 上的 GCC treats arithmetic 就好像它是一个 char*,所以上面的代码应该仍然产生正确的结果 iff​​ 你用 GCC 编译它。

您的第一步应该是通过 运行宁readelf -WS /path/to/file.

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

印刷

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