【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

a.outの分析

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となっています。