はC

2012-09-04 3 views
7

に私はelfdump -ecpsは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 
... 

OTH、版、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

これは、リンク先のドキュメントの119ページから始まるSymbol Tableでほとんどカバーされています。

それは実際にあなたが必要の構造を有する:リンクされたエントリ(st_name構造フィールドから名前を見つけるための具体的手段)のための情報を見つける方法についての詳細と共に

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; 

を。

残念ながら、その文書は、特定の物事が(例えば、バージョン)どこから来た私は、利用可能なソースを持っている別のプログラムをエミュレートしようとしているときに、私はthe sourceに行くカバーしていないようだ - そこに本当にそれよりも決定的なものではありません:-)

そのファイルの1665から、あなたが興味を持っている情報を出力するelf_print_symtab()関数が見つかります。その情報を得るにはget_versym()が呼び出されます1632行目のコードから、別のセクション(version symbol section)を使用していることがわかります。

また、このセクションタイプはOS固有のものの1つと考えられています。そのため、共通のものだけに関係する基本標準では見つからないのです。

0

役立つ何かを見つけることができませんでしたすべての文字列を含む別のセクションです。セクションヘッダーのインデックスとして "セクションヘッダーテーブル"の最初のフィールドを使用して、この文字列セクションから実際の文字列を取得する必要があります。あなたはgoogleでこれに関する多くの記事を見つけることができます。