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

Posted

技术标签:

【中文标题】如何打印像 nm 这样的 ELF 文件的符号名称?【英文标题】:How to print the name of the symbols of ELF files like the nm? 【发布时间】:2018-02-16 19:50:05 【问题描述】:

我知道符号的名称在 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]);

【问题讨论】:

我只知道是关于一些猫的...... 听起来您对某些数据类型感到困惑。你应该发布一个代码 sn-p 来显示你卡在哪里,这样我们就可以看到你在做什么。 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) 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]; 您应该使用 ELF 库(libelf.so 或其他)来读取和分析数据。我不知道你认为“猫”在做什么——你打字的时候有没有人踩到你的键盘? 我正在尝试在没有 flas 的情况下重新编码 nm 【参考方案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);

【讨论】:

但是有一些额外的符号和程序崩溃 @EmployedRussian data 应该是什么?我可以使用str = (char*) strtab-&gt;sh_offset? @Trey data 应该指向通常通过mmapread 将其加载到缓冲区中的文件contents。不,strtab-&gt;sh_offset工作。【参考方案2】:

你必须写symtab-&gt;sh_size / symtab-&gt;sh_entsize 而不是上面帖子所说的symtab-&gt;sh_size / sizeof(Elf64_Sym *)

【讨论】:

以上是关于如何打印像 nm 这样的 ELF 文件的符号名称?的主要内容,如果未能解决你的问题,请参考以下文章

找不到符号表(Elf 格式)(C 编程)

文件 .o 的打印符号

如何在 .so ELF 格式文件的动态符号名称中解释 @abc(01)?

intermec pd43 无法打印像 é 这样的字符

如何从输入类型打印选定的照片名称

我可以从 ELF 文件的符号表中的符号信息中获取对象名称吗?