从elf获取动态符号表信息

时间:2016-06-11 09:38:07

标签: c elf

我试图获得充满活力的&来自elf的静态符号表信息。

我写的代码:

void symbols(){
    int  i;
    Elf32_Ehdr *header; /* this will point to the header structure */
    header = (Elf32_Ehdr *) map_start;

    Elf32_Shdr *shdr = (Elf32_Shdr *)(map_start + header->e_shoff);

    int shnum = header->e_shnum;
    const char * str_p =NULL;
    Elf32_Shdr *sh_strtab = &shdr[header->e_shstrndx];

    const char *const sh_strtab_p = map_start + sh_strtab->sh_offset;
    int j;

    int k;

    for (i = 0; i < shnum; ++i) {
       if ((shdr[i].sh_type == SHT_SYMTAB)||(shdr[i].sh_type==SHT_DYNSYM)){
          str_p =(char *) shdr[shdr[i].sh_link].sh_offset;
          Elf32_Sym *symboler =(Elf32_Sym *)(map_start + shdr[i].sh_offset);
          for(j=0;j<(shdr[i].sh_size/shdr[i].sh_entsize);j++){
              printf("%u ", symboler->st_size); 
              printf("%x ", symboler->st_value); 
              printf("%u ", symboler->st_shndx);
              printf("%s\n",(char *) ((int)map_start+ (int)str_p + symboler->st_name));
              symboler++;
          }
       }
    }
} 

问题在于动态符号表,例如:

 0 0 0 
 0 0 0 __gmon_start__
 0 0 0 __libc_start_main
 0 0 0 fopen
 0 0 0 fgetc
 0 0 0 printf
 0 0 0 atoi
 4 80485dc 15 _IO_stdin_used

当我使用 readelf 时,我得到了这个名字:

 0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
 1: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
 2: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.0 (2)
 3: 00000000     0 FUNC    GLOBAL DEFAULT  UND fopen@GLIBC_2.1 (3)
 4: 00000000     0 FUNC    GLOBAL DEFAULT  UND fgetc@GLIBC_2.0 (2)
 5: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.0 (2)
 6: 00000000     0 FUNC    GLOBAL DEFAULT  UND atoi@GLIBC_2.0 (2)
 7: 080485dc     4 OBJECT  GLOBAL DEFAULT   15 _IO_stdin_used

为什么我的版本中会atoi readelf 中的atoi@GLIBC_2.0 (2)?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

readelf显示除其名称之外的符号版本信息。

解释了符号版本控制here

  

符号版本控制 - 简单说明

     

符号版本控制允许库定义其导出的符号   通过使用地图文件。它还允许一个库   提供相同符号的多个版本。在过去,   没有符号版本控制,这是通过碰撞完成的   共享库版本(libfoo.so.1,libfoo.so.2等)。   现在一个库版本可以提供多个版本的   相同的符号。

有关详细信息,请参阅this page