1

readelf -l /bin/bash私にこれを与える:

プログラム ヘッダー:
  タイプ オフセット VirtAddr PhysAddr
                 FileSiz MemSiz フラグの整列
  PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001f8 0x00000000000001f8 RE 8
  INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001a 0x000000000000001a R 1
      [プログラムインタープリターの要求: /lib/ld-linux-x86-64.so.2]
  ロード 0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x00000000000aeef4 0x00000000000aeef4 RE 200000
  ロード 0x00000000000afde0 0x00000000006afde0 0x00000000006afde0
                 0x0000000000003cec 0x000000000000d3c8   RW 200000
  ダイナミック 0x00000000000afdf8 0x00000000006afdf8 0x00000000006afdf8
                 0x0000000000000200 0x0000000000000200 RW 8
  注 0x0000000000000254 0x0000000000400254 0x0000000000400254
                 0x0000000000000044 0x0000000000000044 R 4
  GNU_EH_FRAME 0x000000000009dbc0 0x000000000049dbc0 0x000000000049dbc0
                 0x0000000000002bb4 0x0000000000002bb4 R 4
  GNU_STACK 0x0000000000000000 0x0000000000000000 0x000000000000000
                 0x0000000000000000 0x0000000000000000 RW 8
  GNU_RELRO 0x00000000000afde0 0x00000000006afde0 0x00000000006afde0
                 0x0000000000000220 0x0000000000000220 R 1

一部のセグメントでMemSizが等しくないのはなぜですか? によって含まれているが含まれていないメモリ領域をどうする必要がありますか?FileSizLOADMemSizFileSiz

4

1 に答える 1

7

問題のロード可能なセグメントは、プログラムのデータ セグメントのようです。

プログラム内のデータ セグメントには、初期化されたプログラム変数と初期化されていないプログラム変数の両方のスペースが含まれています。初期化された変数の値は、プログラムの実行可能ファイルに格納されます。初期化されていないプログラム変数は、どこにも保存する必要はありません。代わりに、".bss" という名前のサイズがゼロの特別なセクションにスペースが予約されています。

したがって、実行可能ファイルのデータ セグメントのファイル サイズは、メモリ内のサイズよりも小さくすることができます。

説明する:

/*
 * Space for the intialized variable 'x' would be reserved the
 * executable's ".data" section, along with its initial value.
 */
int x = 42;

/*
 * Space for the uninitialized variable 'y' would be reserved in
 * the ".bss" section; no file space would be allocated in the
 * executable.
 */
int y;

UNIX ライクなシステムでは、「.bss」セクションにマップされたデータ セグメントの部分は、プログラムのロード時にゼロで埋められます。

于 2012-11-18T06:18:57.983 に答える