7

現在、私はelfファイルヘッダーを読み取り、いくつかの情報を出力する小さなプログラムを書いています

elfファイルがメモリ内にある場所を指すbufというunsignedcharポインタがあり(mmapを使用してメモリにマップしました)、適切なelfヘッダーポインタに型キャストします

Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf;

この後、プログラムヘッダーテーブルのアドレスを取得したいので、このようにします

Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff)

ptblポインターの値が変更されないことに気付いたので、このようにe_phoffメンバーの値を出力しようとすると

fprintf( stdout , "Offset of program headers : %d\n", ehdr->e_phoff);

プログラムヘッダーの数とセクションヘッダーの数を出力しようとすると、同じことが起こります-常にゼロになりますLinux readelfを使用すると、適切な値が出力されます誰かが同じ問題を経験しましたか?

4

1 に答える 1

5

ELFオブジェクトを解析するときは、次の点に注意する必要があります。

  1. ファイル内構造(ELF実行可能ヘッダーなど)のサイズ、ファイル配置、および内部レイアウトは、ELFオブジェクトのワードサイズによって異なります。
  2. ELFオブジェクトのエンディアンは、オブジェクトを読み取るプログラムの「ネイティブ」エンディアンとは異なる場合があります。
  3. 多数のセクションまたはプログラムセグメントを含むELFオブジェクトは、代替の「拡張番号付け」スキームを使用する場合があります。

これらのケースを手動で処理するよりも、ELF(3)アクセスAPIの実装を使用してELFオブジェクトを解析する方が簡単な場合があります(BSDlibelfまたはGNUlibelfを参照)。

チュートリアル「libelfbyExample」には、ELF(3)APIの読みやすい紹介が含まれています。

于 2012-04-29T04:05:02.200 に答える