日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.3-RELEASE-K, 13.0-RELEASE-K から 13.2-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
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 このオブジェクトファイルが位置独立 (position inde pendent) なコードを含んでいることを示します。このフ ラグは、`-k' フラグ指定時に as(1) によって設定さ れ、必要なら ld(1) は、これを保存します。 EX_DYNAMIC と EX_PIC の両方がセットされている場合、そのオブジェ クトファイルは、位置独立な実行可能イメージです (例: 共有ライブ ラリ)。これは、ランタイムリンクエディタによってプロセスのアドレ ス空間にロードされます。 マクロ N_GETMID() は、マシン識別コード (machine-id) を返しま す。これは、バイナリファイルが実行されるべきマシンを示していま す。 N_GETMAGIC() は、マジックナンバを示します。マジックナンバは、バ イナリファイル種別を一意に識別し、様々なロード方法を区別しま す。このフィールドは、以下の値のいずれか 1 つを含んでいなければ なりません: OMAGIC テキストセグメントとデータセグメントは、ヘッダの直後に あり、連続しています。カーネルは、テキスト/データセグメ ントの両方を書き込み可能メモリ領域にロードします。 NMAGIC OMAGIC と同様、テキスト/データセグメントは、ヘッダの直 後にあり、連続しています。しかし、カーネルは、テキスト セグメントを読み込み専用メモリ領域にロードし、テキスト に続くページ境界から始まる書き込み可能メモリ領域にデー タセグメントをロードします。 ZMAGIC カーネルは、各々のページを必要に応じてバイナリからロー ドします。ヘッダ、テキストセグメント及びデータセグメン トは、いずれも、ページサイズの倍数の大きさになるよう、 リンクエディタによってパディングされます。カーネルがテ キストセグメントからロードしたページは、読み込み専用で すが、データセグメントからロードしたページは、書き込み 可能です。 a_text テキストセグメントのサイズ (バイト単位) を保持します。 a_data データセグメントのサイズ (バイト単位) を保持します。 a_bss `bss セグメント' のバイト数を保持します。この値は、カーネルが最 初の break 値 (brk(2)) をデータセグメントの後ろに設定するのに用 いられます。カーネルは、ここに示されるサイズの書き込み可能メモ リ領域がデータセグメントの後ろに用意され、それらの初期状態が 0 になるように、プログラムをロードします。(bss = block started by symbol:シンボルで開始するブロック) a_syms シンボルテーブルセクションのサイズ (バイト単位) を保持します。 a_entry カーネルがバイナリファイルをロードした後の、プログラムのエント リポイントのメモリアドレスを保持します。カーネルは、このアドレ スにある機械命令からプログラムの実行を開始します。 a_trsize テキストリロケーションテーブルのサイズ (バイト単位) を保持しま す。 a_drsize データリロケーションテーブルのサイズ (バイト単位) を保持しま す。 インクルードファイル <a.out.h> では、exec 構造体を用いて一貫性をテストし たりバイナリファイル中のセクションオフセットを知るためのマクロが定義され ています。 N_BADMAG(exec) a_magic フィールドに、認識できない値が含まれている場合、 非 0 を返します。 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_extern ビットが立ってい なければ状況は異なります。以下を参照してください。) r_pcrel もしこのビットが立っていれば、リンクエディタは、PC 相対アド レッシングを用いる機械語命令の一部であるポインタを更新してい るものと仮定します。リロケートされるポインタのアドレスは、実 行中のプログラムがそれを用いる際に、暗黙的にその値に加算され ます。 r_length ポインタの長さを 2 を底とする対数で表したバイト単位で保持し ます。1 バイトディスプレースメントなら 0、2 バイトディスプ レースメントなら 1、4 バイトディスプレースメントなら 2 とな ります。 r_extern このリロケーションが外部参照を必要としている場合にセットされ ます。リンクエディタは、シンボルアドレスを用いてこのポインタ を更新しなければなりません。r_extern ビットが立っていない場 合、そのリロケーションは、`ローカル' です。リンクエディタ は、シンボル値の変化ではなく、各セグメントのロードアドレスの 変化に応じてポインタを更新します (ただし、r_baserel もセット されている場合 (後述) は、除きます)。この場合、r_symbolnum フィールドの内容は、n_type の値となります(後述)。リンクエ ディタは、この型フィールドから、リロケートされるポインタがど のセグメントを指しているのかの情報を得ます。 r_baserel セットされている場合、r_symbolnum フィールドで指定される場合 のように、このシンボルは、グローバルオフセットテーブルへのオ フセットにリロケートされます。実行時に、グローバルオフセット テーブル中の、このオフセット位置にあるエントリが、シンボルの アドレスを持つようにセットされます。 r_jmptable セットされている場合、r_symbolnum フィールドで指定される場合 のように、このシンボルは、プロシージャリンケージテーブルへの オフセットにリロケートされます。 r_relative セットされている場合、このリロケーションは、このオブジェクト ファイルが含まれるイメージの (実行時の) ロードアドレスとの相 対値となります。この種のリロケーションは、共有オブジェクトに のみ現れます。 r_copy セットされている場合、このリロケーションレコードは、その内容 を r_address で指定される位置にコピーしなければならないシン ボルを示します。コピー処理は、実行時のリンクエディタによっ て、共有オブジェクト中の適切なデータアイテムから行われます。 シンボルは、名前とアドレスを対応づけます (より一般的には、文字列を値へ対 応づけます)。リンクエディタがアドレスを調節するため、絶対値が割り当てられ るまでは、シンボルを用いてアドレスを表現しなければなりません。シンボル は、シンボルテーブル中の固定長のレコードと、文字列テーブル中の可変長の名 前から成ります。シンボルテーブルは、nlist 構造体の配列です: struct nlist { union { const 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_type フィールドは、ビットマスクを用いた 3 つのサブ フィールドに分けられます。リンクエディタは、N_EXT ビットが セットされているシンボルを `external' シンボルとして扱い、他 のバイナリファイルからの参照を許可します。N_TYPE マスクは、 リンクエディタに必要なビットを選択します: N_UNDF 未定義シンボル。リンクエディタは、他のバイナリファイ ル中の同じ名前の外部シンボルを探してこのシンボルの絶 対値を決定しなければなりません。特別な場合として、も し n_value フィールドが非 0 で、リンクエディット対象 のどのバイナリファイルもこのシンボルを定義していない 場合、リンクエディタは、このシンボルが bss セグメン ト中のアドレスであるとみなし、n_value に等しいバイト 数の領域を予約します。もしこのシンボルが複数のバイナ リファイル中で未定義となっており、それらのバイナリ ファイル間でサイズが異なっている場合、リンクエディタ は、それらのサイズの最大値を選びます。 N_ABS 絶対シンボル。リンクエディタは、絶対シンボルは更新し ません。 N_TEXT テキストシンボル。このシンボルの値は、テキストアドレ スであり、リンクエディタは、バイナリファイルをマージ する際、その値を更新します。 N_DATA データシンボル。N_TEXT と同様ですが、データアドレス を表します。テキストシンボル及びデータシンボルの値 は、ファイルオフセットではなくアドレスです。ファイル オフセットを復元するために、対応するセクションの先頭 のロードアドレスを見つけてそれを減じ、次にそのセク ションのオフセットを加算する必要があります。 N_BSS bss シンボル。テキストシンボルやデータシンボルと似て いますが、バイナリファイル中に対応するオフセットを持 ちません。 N_FN ファイル名シンボル。バイナリファイルをマージする際、 リンクエディタは、バイナリファイルの他のシンボルの前 にこのシンボルを挿入します。このシンボルの名前は、リ ンクエディタに与えられたファイル名で、シンボルの値 は、バイナリファイルから得た先頭テキストアドレスで す。ファイル名シンボルは、リンクエディト処理やロード 処理には不要ですが、デバッガには、有用な情報です。 N_STAB マスクは、gdb(1) 等のシンボリックデバッガに必要なビッ トを選択します。その値は、stab(5) に示されています。 n_other このフィールドは、n_type フィールドで決定されるセグメントに 関して、そのシンボルのロケーションとは独立したシンボルの特質 に関する情報を提供します。現在のところ、n_other フィールドの 下位 4 ビットは、AUX_FUNC あるいは AUX_OBJECT のいずれかをと ります (これらの定義については、<link.h> を参照してくださ い)。AUX_FUNC は、シンボルと呼び出し可能な関数を関連づけ、他 方、AUX_OBJECT は、シンボルとデータを関連づけます。これらの 関連は、テキストセグメント/データセグメントの別とは無関係で す。このフィールドは、ld(1) が動的な実行可能形式を構築するた めに使うことを意図しています。 n_desc デバッガ用に予約されており、リンクエディタは、このフィールド を全く変更しません。デバッガによって異なった目的に使われま す。 n_value シンボルの値を保持します。テキスト, データおよび bss シンボ ルの場合、その値は、アドレスです。他のシンボル (例えばデバッ ガシンボル等) の場合、その値は、様々です。 文字列テーブルは、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 11.2 June 10, 2010 FreeBSD 11.2