ファイルヘッダーの一部

ファイルヘッダーの一部

私は C プログラムに取り組んでいましたが、Linux/UNIX 開発は初めてなので、いろいろと調べていました。

Hello world の簡単な C プログラムを作成し、コンパイル プロセスを検査していました。

最終的な実行可能ファイルのファイルヘッダーを読み取ろうとしたところ、次のような出力が得られました。

$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**

elf32-i386 の部分は理解していますが、ヘッダーの他の部分についてはよくわかりません。

D_PAGEDデマンド ページングと何らかの関係があります か? どういう意味ですか? 開始アドレスは、プログラムのEXEC_P, HAS_SYSMS論理アドレスですか?main()

答え1

出力のフラグはBFD - バイナリ ファイル記述子これらはbinutilsパッケージの一部であり、フラグの/usr/include/bfd.h意味についてはbfdヘッダーファイルを参照するか、ここ

「旗」への言及0x00000112いわゆるフラグフィールドこれはバイナリで、各ビットは特定の機能を表します。1 はフラグがオンまたは設定されていることを意味し、0 はそうではないことを意味します。また、「0x...」は 16 進数値であることを意味するので、これを HEX から BIN に変換すると次のようになります。

0x00000112 = 2進数では 0001 0001 0010 です。

したがって、フラグ フィールドの 2 番目、5 番目、および 9 番目のビットに対応するフラグが設定されます。これらは、コマンドの出力の 3 行目に名前で表示されるフラグですobjdump

旗の意味

実行可能ファイルにある 3 つのフラグは標準的なものです。ビットを右から左に読んでください。

1 ビット目 - 0000 0000 0010

  /* BFD is directly executable.  */
#define EXEC_P         0x02

2番目のビット - 0000 0001 0000

  /* BFD has symbols.  */
#define HAS_SYMS       0x10

3番目のビット - 0001 0000 0000

  /* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
     linker sets this by default, but clears it for -r or -n or -N).  */
#define D_PAGED        0x100

まとめ:

  • これは実行ファイルです
  • Gnu Debuggerを使用してデバッグする場合はシンボルテーブルが含まれているためgdb、関数には意味のある名前が付けられます。
  • 実行可能ファイルは、glibc などの標準ライブラリに動的にリンクされます。

開始アドレス

最後の行の開始アドレス...は、ご想像のとおり、実行可能ファイルの実際の .CODE が始まる場所です。

関連情報