繁体   English   中英

从elf获取动态符号表信息

[英]getting dynamic symbol table information from 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在我的版本和atoi@GLIBC_2.0 (2)readelf? 我该如何解决?

readelf显示名称以外,还显示有关符号版本的信息。

在此说明符号版本控制。

符号版本控制-简单说明

通过符号版本控制,库可以通过使用映射文件来定义其导出的符号。 它还允许一个库提供同一符号的多个版本。 过去,没有符号版本控制,这是通过增加共享库版本(libfoo.so.1,libfoo.so.2等)来实现的。 现在,一个库版本可以提供同一符号的多个版本。

有关更多详细信息,请参阅此页面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM