2012-09-04 96 views
7

我正在寫一個程序來模擬elfdump -ecps訪問ELF符號表用C

目前,它打印出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章),但一直沒能找到什麼有用的

+0

你能跟我們分享一下模擬elfdump的代碼嗎? –

回答

11

這大部分都在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結構字段查找名稱的手段)的詳細信息。

不幸的是,該文件似乎並沒有涵蓋某些事情來自(版本爲例),所以,當我試圖仿效有可用的源另一個程序,我the source - 有真的是沒有什麼比這:-)

在該文件的1665行開始更明確,你會發現elf_print_symtab()功能,它負責輸出你感興趣的信息。它要求get_versym()來獲取信息並從1632行的代碼中,可以看到它使用了不同的部分(version symbol section)。

而且,可以看到here,該節類型被認爲是特定於操作系統的節點類型之一,這就是爲什麼你不會在基本標準中找到它,這隻涉及常見的東西。

0

對於名稱,有是另一個包含所有字符串的部分。您應該使用「部分標題表」中的第一個字段作爲部分標題中的索引以從此字符串部分獲取實際字符串。你可以在google上找到很多關於這個的文章。