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

时间:2018-02-16 19:50:06

标签: c casting elf nm

我知道符号的名称在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 < elf->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 < (symtab->sh_size / sizeof(Elf64_Sym *)); i ++) {
  printf("%s\n", &str[shstrtab[i].sh_name]);
}

2 个答案:

答案 0 :(得分:1)

  

我应该将我的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);
}

答案 1 :(得分:0)

您必须像上面的帖子所述那样写symtab->sh_size / symtab->sh_entsize,而不像symtab->sh_size / sizeof(Elf64_Sym *)