7

模倣するプログラムを書いています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
...

oth、ver、shndx、nameがどこにあるか教えていただけますか?

これまでのところ、私はそれを次のように印刷しています:

//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章)を読んでいますが、役立つものを見つけることができませんでした

4

2 に答える 2

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構造フィールドから名前を検索する方法) について説明します。

残念ながら、そのドキュメントは特定のものの由来 (バージョンなど) をカバーしていないようです。そのため、ソースが利用可能な別のプログラムをエミュレートしようとすると、ソースに移動ますが、実際には何もありません。それよりも決定的な:-)

そのファイルの 1665 行目から、elf_print_symtab()目的の情報を出力する関数が見つかります。この関数はその情報を取得するために呼び出しget_versym()、1632 行目のコードから、別のセクションを使用していることがわかります。それ(バージョン記号セクション)。

そして、ここで見られるように、そのセクション タイプは OS 固有のものの 1 つと見なされます。そのため、一般的なものだけに関係する基本標準では見つかりません。

于 2012-09-04T01:08:42.637 に答える
0

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

于 2012-09-04T01:07:09.250 に答える