打印ELF文件的符号表

kit*_*Fox 5 c mmap elf symbol-table

我有一个使用mmap系统调用的程序:

map_start = mmap(0, fd_stat.st_size, PROT_READ | PROT_WRITE , MAP_SHARED, fd, 0)
Run Code Online (Sandbox Code Playgroud)

和一个标题变量:

header = (Elf32_Ehdr *) map_start;
Run Code Online (Sandbox Code Playgroud)

如何访问符号表并使用标头变量打印其整个内容?

Chr*_*odd 6

您可以通过查看e_shoffelf标题的字段来获取节表:

sections = (Elf32_Shdr *)((char *)map_start + header->e_shoff);
Run Code Online (Sandbox Code Playgroud)

您现在可以在节表中搜索具有类型的部分SHT_SYMBTAB,即符号表.

for (i = 0; i < header->e_shnum; i++)
    if (sections[i].sh_type == SHT_SYMTAB) {
        symtab = (Elf32_Sym *)((char *)map_start + sections[i].sh_offset);
        break; }
Run Code Online (Sandbox Code Playgroud)

当然,如果您的文件不是ELF文件或以某种方式损坏,您还应该进行大量的健全性检查.

Linux的精灵(5)手册有很多关于格式的信息的.

  • `sh_size`告诉你符号表的大小(以字节为单位); 除以`sh_entsize`(应与`sizeof(Elf32_Sym)`相同)以获得条目数. (3认同)