访问ELF符号表用C(Accessing ELF symbol table in C)

2019-07-31 08:16发布

我正在写一个程序来模拟elfdump -ecps

目前,它打印出ELF头,程序头和节头正确,但我卡在符号表的最后几部分组成。

所期望的输出是在的格式:

Symbol Table Section:  .dynsym
 index    value      size      type bind oth ver shndx          name
   [0]  0x00000000 0x00000000  NOTY LOCL  D    0 UNDEF          
   [1]  0x00025c0c 0x00000000  FUNC GLOB  D    2 UNDEF          .udiv
   [2]  0x00025e00 0x00000140  OBJT WEAK  D    1 .bss           _iob
   [3]  0x00025b24 0x00000000  OBJT GLOB  P    1 .got           _GLOBAL_OFFSET_TABLE_
   [4]  0x00013a44 0x0000001c  FUNC GLOB  D    1 .init          _init
...

你能告诉我哪里有超视距,版本,shndx和名称被发现?

到目前为止,我打印出来有以下几点:

//for each entry in the symbol table
for(i=0; i<num_sym; i++)
{
    //read the current symbol
    fread(&mysym,sizeof(Elf32_Sym),1,fp);
idx=mysym.st_name;

    //multiple lines to get formatting correct
    //prints index in brackets right aligned
    char buf[12];
    sprintf(buf, "[%d]", i);
    printf("%10s", buf);

    //value
    printf("  0x%.8x", mysym.st_value);
    //size
    printf(" 0x%.8x", mysym.st_size);

    //type
    switch (ELF32_ST_TYPE(mysym.st_info)) {
        case 0:
            printf("  NOTY");
            break;
        case 1:
            printf("  OBJT");
            break;
        case 2:
            printf("  FUNC");
            break;
        case 3:
            printf("  SECT");
            break;
        case 4:
            printf("  FILE");
            break;

        default:
            break;
    }

    //bind
    switch(ELF32_ST_BIND(mysym.st_info))
    {
        case 0: printf(" LOCL");
            break;
        case 1: printf(" GLOB");
            break;
        case 2: printf(" WEAK");
            break;
        case 3: printf("  NUM");
            break;

        default:
            break;
    }
    //TODO: oth
    //TODO: ver
    //TODO: shndx
    //TODO: name

}

我一直在通过阅读http://docs.oracle.com/cd/E19457-01/801-6737/801-6737.pdf (第5章),但一直没能找到任何有用的

Answer 1:

这下大多覆盖Symbol Table开始您链接到文件的第119页。

它实际上您所需要的结构:

typedef struct {
    Elf32_Word    st_name;
    Elf32_Addr    st_value;
    Elf32_Word    st_size;
    unsigned char st_info;
    unsigned char st_other;
    Elf32_Half    st_shndx;
} Elf32_Sym;

并给出如何找到条目链接的信息(特别是从查找名称的手段细节st_name结构域)。

不幸的是,该文件似乎并没有涵盖某些事情来自(版本为例),所以,当我试图仿效有可用的源另一个程序,我 源 -真的没有什么比:-)更明确

从那天文件的1665行,你会发现elf_print_symtab()函数,它负责输出你感兴趣的信息。它调用get_versym()来获取信息,并从1632行的代码,你可以看到它使用的是一个不同的部分( 版本码元部分 )。

而且,可以看出这里 ,那款型被认为是特定的OS-者之一,这就是为什么你会不会在基本标准,它涉及本身只与普通的东西找到它。



Answer 2:

对于名称,有它包含的所有字符串另一部分。 您应该使用的第一个字段“节头表”作为指数节头,以获得该串节真正的字符串。 您可以找到有关这与谷歌的许多文章。



文章来源: Accessing ELF symbol table in C