如何打印像nm这样的ELF文件的符号名称?

我知道符号的名称在shstrtab中。 但我不明白如何捕捉它们。 我应该将我的shstrab转换为Elf64_Sym,以便我可以使用st_name吗?

Elf64_Shdr *shdr = (Elf64_Shdr *) (data + elf->e_shoff); Elf64_Shdr *symtab; Elf64_Shdr *shstrtab; Elf64_Shdr *strtab; char *str = (char *) (data + shdr[elf->e_shstrndx].sh_offset); for (int i = 0; i e_shnum; i++) { if (shdr[i].sh_size) { printf("%s\n", &str[shdr[i].sh_name]); if (strcmp(&str[shdr[i].sh_name], ".symtab") == 0) symtab = (Elf64_Shdr *) &shdr[i]; if (strcmp(&str[shdr[i].sh_name], ".shstrtab") == 0) shstrtab = (Elf64_Shdr *) &shdr[i]; if (strcmp(&str[shdr[i].sh_name], ".strtab") == 0) strtab = (Elf64_Shdr *) &shdr[i]; } } str = (char *) shstrtab; for (size_t i = 0; i sh_size / sizeof(Elf64_Sym *)); i ++) { printf("%s\n", &str[shstrtab[i].sh_name]); } 

我应该将我的shstrab转换为Elf64_Sym,以便我可以使用st_name吗?

没有。

这是你想要的循环:

 Elf64_Sym *sym = (Elf64_Sym*) (data + symtab->sh_offset); str = (char*) (data + strtab->sh_offset); for (size_t i = 0; i < (symtab->sh_size / sizeof(Elf64_Sym *)); i++) { printf("%s\n", str + sym[i].st_name); }