私は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が始まる場所です。