ファイルヘッダー部分

ファイルヘッダー部分

私は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パッケージの一部であり、bfdヘッダーファイルでその意味を見つけることも、このフラグの意味を理解することもできます/usr/include/bfd.hここ

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

0x00000112 = 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デバッガを使用してデバッグする場合は、関数gdbに意味のある名前を持つシンボルテーブルが含まれています。
  • 実行ファイルはglibcなどの標準ライブラリに動的にリンクされています。

初期アドレス

最後の行である開始アドレス...は、推測できるように、実行可能ファイルの実際の.CODEが始まる場所です。

関連情報