id:n7shi:20100202でアセンブリ化したサンプルのダンプです。
00000000: 01 03 04 10 30 00 00 00-38 00 00 00 00 00 00 00 00000010: 00 00 00 00 00 00 00 00-38 00 50 00 00 00 00 00 00000020: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00000030: B8 00 00 00 00 BB 11 00-00 00 B9 03 00 00 00 CD 00000040: 21 00 00 00 00 01 00 00-00 2A 00 00 00 00 00 00 00000050: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00000060: 00 00 00 00 00 90 90 90
これを分析してみます。
objdump
binutilsに含まれるobjdumpを使います。
% i386-pc-minix-objdump -x a.out a.out: file format a.out-i386-minix a.out architecture: i386, flags 0x00000182: EXEC_P, WP_TEXT, D_PAGED start address 0x00000000 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000038 00000000 00000000 00000030 2**3 CONTENTS, ALLOC, LOAD, CODE 1 .data 00000000 00000038 00000038 00000068 2**3 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000038 00000038 00000000 2**3 ALLOC SYMBOL TABLE: no symbols
あまり詳しい情報が得られません。
aout-tool
a.out.hで定義されている構造体に当てはめてダンプするツールを自作しました。
実行結果は以下の通りです。
% aout-tool a.out 00000000: a_magic 01 03 magic number a.out executable 00000002: a_flags 04 flags, see below A_NSYM 00000003: a_cpu 10 cpu id A_I80386: A_BLR=0, A_WLR=0 00000004: a_hdrlen 30 length of header A_HASRELS A_HASEXT 00000005: a_unused 00 reserved for future use 00000006: a_version 0000 version stamp (not used at present) 00000008: a_text 00000038 size of text segement in bytes 0000000c: a_data 00000000 size of data segment in bytes 00000010: a_bss 00000000 size of bss segment in bytes 00000014: a_entry 00000000 entry point 00000018: a_total 00500038 total memory allocated 0000001c: a_syms 00000000 size of symbol table 00000020: a_trsize 00000000 text relocation size 00000024: a_drsize 00000000 data relocation size 00000028: a_tbase 00000000 text relocation base 0000002c: a_dbase 00000000 data relocation base A_TEXTPOS: 00000030 <- a_hdrlen A_DATAPOS: 00000068 <- A_TEXTPOS + a_text A_TRELPOS: 00000068 <- A_DATAPOS + a_data A_DRELPOS: 00000068 <- A_TRELPOS + a_trsize
セクションがtext, data, bssに固定されていることが分かります。
このバイナリは以下の構造になっています。
- 00000000〜0000002f: a.outヘッダ
- 00000030〜00000067: textセクション → プロセス展開後: 00000000〜00000037
textセクションはプロセス内の論理アドレス00000000に配置されるため、エントリーポイントも00000000となっています。