A.OUT(5) FreeBSD ファイルフォーマットマニュアル A.OUT(5)
名称
a.out − 実行可能バイナリファイルのフォーマット |
書式
#include <a.out.h> |
解説
インクルードファイル <a.out.h> では 3 つの構造体といくつかのマクロが宣言 されています。これらの構造体は、このシステムで実行可能な機械語コードファ イル (‘バイナリ’) のフォーマットを規定します。 バイナリファイルは最大で 7 つのセクションから構成されます。これらのセク ションを順にあげると以下のようになります: |
exec ヘッダ
バイナリファイルをメモリ上にロードして実行するた めにカーネルが用いるパラメータを含んでいます。こ れらのパラメータはリンクエディタ ld(1) がバイナリ ファイルを他のバイナリファイルと結合する際にも用 いられます。このセクションは唯一の必須セクション です。 テキストセグメント データセグメント テキストリロケーション データリロケーション シンボルテーブル string table 全てのバイナリファイルは次の exec 構造体で始まります: struct exec { |
unsigned long |
||||
a_midmag; |
||||
unsigned long |
||||
a_text; |
||||
unsigned long |
||||
a_data; |
||||
unsigned long |
||||
a_bss; |
||||
unsigned long |
||||
a_syms; |
||||
unsigned long |
||||
a_entry; |
||||
unsigned long |
||||
a_trsize; |
||||
unsigned long |
||||
a_drsize; |
}; これらのフィールドは以下の機能を持っています: |
a_midmag
このフィールドはホストのバイト順 (host byte-order) で格納されま す。このフィールドはいくつかのサブコンポーネントを持っており、 それらは以下のマクロ N_GETFLAG(), N_GETMID(), N_GETMAGIC() で参 照され、マクロ N_SETMAGIC() で設定されます。 マクロ N_GETFLAG() は以下のフラグを返します: EX_DYNAMIC EX_PIC EX_DYNAMIC と EX_PIC の両方がセットされている場合、そのオブジェ クトファイルは位置独立な実行可能イメージです (例: 共有ライブラ リ)。これはランタイムリンクエディタによってプロセスのアドレス空 間にロードされます。 マクロ N_GETMID() はマシン識別コード (machine-id) を返します。 これは、バイナリファイルが実行されるべきマシンを示しています。 N_GETMAGIC() はマジックナンバを示します。マジックナンバはバイナ リファイル種別を一意に識別し、様々なロード方法を区別します。こ のフィールドは以下の値のいずれか 1 つを含んでいなければなりませ ん: OMAGIC NMAGIC ZMAGIC a_text a_data a_bss a_syms a_entry a_trsize a_drsize インクルードファイル <a.out.h> では、 exec 構造体を用いて一貫性をテストし たりバイナリファイル中のセクションオフセットを知るためのマクロが定義され ています。 N_BADMAG(exec) N_TXTOFF(exec) N_SYMOFF(exec) N_STROFF(exec) リロケーションレコードは、 relocation_info 構造体で規定される標準フォー マットです: struct relocation_info { |
int |
r_address; |
|||
unsigned int |
r_symbolnum : 24, |
|||
r_pcrel : 1, |
||||
r_length : 2, |
||||
r_extern : 1, |
||||
r_baserel : 1, |
||||
r_jmptable : 1, |
||||
r_relative : 1, |
||||
r_copy : 1; |
}; relocation_info 構造体の各フィールドは以下のように用いられます: |
r_address
リンクエディットが必要なポインタのバイトオフセットを保持しま す。テキストリロケーションオフセットはテキストセグメントの先 頭から、データリロケーションオフセットはデータセグメントの先 頭から、それぞれ計算します。リンクエディタはこのオフセットに ストアされている値を加算し、このリロケーションレコードを用い て計算した新しい値に変換します。 r_symbolnum r_pcrel r_length r_extern r_baserel r_jmptable r_relative r_copy シンボルは名前とアドレスを対応づけます (より一般的には、文字列を値へ対応 づけます)。リンクエディタがアドレスを調節するため、絶対値が割り当てられる まではシンボルを用いてアドレスを表現しなければなりません。シンボルは、シ ンボルテーブル中の固定長のレコードと、文字列テーブル中の可変長の名前から 成ります。シンボルテーブルは nlist 構造体の配列です: struct nlist { |
union { |
||||
char |
||||
*n_name; |
||||
long |
||||
n_strx; |
||||
} n_un; |
||||
unsigned char |
n_type; |
|||
char |
||||
n_other; |
||||
short |
||||
n_desc; |
||||
unsigned long |
n_value; |
}; これらのフィールドは以下のように用いられます: |
n_un.n_strx
このシンボルの名前の、文字列テーブルでのバイトオフセットを保 持します。プログラムが nlist(3) 関数を用いてシンボルテーブル をアクセスする場合、このフィールドは、メモリ中の文字列へのポ インタである n_un.n_name フィールドに置き換えられます。 n_type N_UNDF N_ABS N_TEXT N_DATA N_BSS N_FN N_STAB マスクは gdb(1) 等のシンボリックデバッガに必要なビッ トを選択します。その値は stab(5) に示されています。 n_other n_desc n_value 文字列テーブルは unsigned long 型の長さと、それに続くナル終端のシンボル文 字列から成ります。この長さは、テーブル全体のサイズをバイト単位で表しま す。つまり、その最小値 (言い替えれば、最初の文字列のオフセット) は、 32 ビットマシンでは常に 4 となります。 関連項目 |
as(1), gdb(1), ld(1), brk(2), execve(2), nlist(3), core(5), elf(5), link(5), stab(5) |
歴史
インクルードファイル <a.out.h> は Version 7 AT&T UNIX で登場しました。 |
バグ
必ずしも全てのサポート対象アーキテクチャが a_midmag フィールドを用いるわ けではないので、あるバイナリがどのようなアーキテクチャ上で実行されるのか は、実際のマシンコードを調べない限り判定困難な可能性があります。マシン ID があったとしても、 exec ヘッダのバイト順はマシン依存です。 FreeBSD 10.0 June 5, 1993 FreeBSD 10.0 |