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