5

単純な C ファイル:

#include <stdio.h>
int main(){
    printf("Hello World");
    return 0;
}

を使用してコードをコンパイルした後readelf -a a.out、エルフ情報は次のとおりです。

elf プログラム ヘッダー、セグメント情報

質問:

  1. 2 番目と 3 番目のセグメントの両方の interp セクションのように、いくつかのセクションが異なるセグメントに表示されます。セクションを複数のセグメントに表示するにはどうすればよいですか?
  2. 2 番目のセグメントのアドレスは 0x8048134 からですが、3 番目の LOAD セグメントは 0x8048000 から始まり、memsize は 0x004d0 です。その後、2 つのセグメントが重なっていますか? メモリ内で 2 つのセグメントがオーバーラップする方法
  3. プログラム ヘッダーのオフセットと viraddr がページ サイズを法として一致しなければならないのはなぜですか?
4

2 に答える 2

6

セクションテーブルにゴミがあるか、完全に欠落している可能性があります。ダイナミックローダーにとって重要なのはセグメントテーブル(プログラムヘッダー)だけであり、それでも、PT_LOADセグメントのみがオーバーラップしてはなりません*。他の種類のセグメント(INTERP、DYNAMICなど)は、ローダーに追加情報を提供し、通常はLOADセグメントの一部を参照します。

*仕様の内容は次のとおりです。

PT_LOAD配列要素は、 p_fileszおよびで記述されるロード可能なセグメントを指定しますp_memsz。ファイルのバイトは、メモリセグメントの先頭にマップされます。セグメントのメモリサイズ(p_memsz)がファイルサイズ()より大きい場合p_filesz、「余分な」バイトは値0を保持し、セグメントの初期化された領域に従うように定義されます。ファイルサイズはメモリサイズより大きくすることはできません。p_vaddrプログラムヘッダーテーブルのロード可能なセグメントエントリは、メンバーでソートされた昇順で表示されます。

ご覧のとおり、重複については言及されていないため、PT_LOADセグメントが重複しているファイルは見たことがないと思いますが、禁止されているようには見えません。

于 2012-06-04T12:07:43.083 に答える
-2
  1. 2 番目と 3 番目のセグメントの両方の interp セクションのように、いくつかのセクションが異なるセグメントに表示されます。

そう?

セクションを複数のセグメントに表示するにはどうすればよいですか?

なぜだめですか?

セクションが複数のPT_LOADセグメントに現れることはありませんが、 aと a の.interp両方に現れても問題はありません。PT_LOADPT_INTERP

  1. メモリ内で 2 つのセグメントがオーバーラップする方法

繰り返しますが、なぜですか?

  1. プログラム ヘッダーのオフセットと viraddr がページ サイズを法として一致しなければならないのはなぜですか?

そうしないとmmap、セグメントにそれを表示させることが不可能になるからvirtaddrです。

于 2012-06-03T20:57:32.303 に答える