日本語 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 つの構造体といくつかのマクロを宣言し ています。構造体は、システムの実行形式のマシンコードファイル (`binaries') の形式を記述しています。 バイナリファイルは、最大 7 つのセクションで構成されています。順々に、これ らのセクションは、次の通りです。 exec ヘッダ バイナリファイルをメモリにロードして、それを実行するた めにカーネルによって、そして、バイナリファイルを他のバ イナリファイルと結合するためにリンクエディタ ld(1) に よって使用されるパラメータを含んでいます。このセクショ ンは、必須のセクションのみです。 テキストセグメント プログラムが実行するとき、メモリにロードされるマシン コードと関連データを含みます。読み込み専用でロードされ る場合があります。 データセグメント 初期化されたデータを含んでいます。常に、書き込み可能な メモリにロードされます。 テキストリロケーション バイナリファイルを結合するとき、テキストセグメント内の ポインタを更新するためにリンクエディタによって使用され るレコードを含んでいます。 データのリロケーション テキストのリロケーションセクションと同様ですが、データ セグメントポインタのためです。 シンボルテーブル 指定された変数のアドレスとバイナリファイルの間の関数 (`symbols') を相互参照するリンクエディタによって使用さ れるレコードを含んでいます。 文字列テーブル シンボル名に対応する文字列を含んでいます。 すべてのバイナリファイルは、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 このフィールドは、ホストのバイト順で格納されます。それには、マ クロ N_GETFLAG(), N_GETMID() と N_GETMAGIC() によってアクセスさ れるサブ構成要素の数があり、マクロ N_SETMAGIC() によって設定さ れます。 マクロ N_GETFLAG() は、いくつかのフラグを返します: EX_DYNAMIC 実行形式が実行時のリンクエディタのサービスを必要と することを示します。 EX_PIC オブジェクトに位置に依存しない (position indepen dent) コードが含まれていることを示します。このフラ グは、`-k' フラグが与えられたとき、as(1) によって設 定され、必要であるなら、ld(1) によって保存されま す。 EX_DYNAMIC と EX_PIC の両方が設定されているなら、オブジェクト ファイルは、実行時のリンクエディタによってプロセスアドレス空間 にロードされる、位置に依存しない実行形式イメージ (例えば、共有 ライブラリ) です。 マクロ N_GETMID() は、マシン ID を返します。これは、バイナリが 実行されることを目的としている (複数の) マシンを示します。 N_GETMAGIC() は、バイナリファイルをユニークに識別し、異なるロー ド規約を区別するマジックナンバを指定します。フィールドは、次の 値の 1 つが含まれていなければなりません: OMAGIC テキストとデータセグメントは、ヘッダの直後に続き、連続 しています。カーネルは、テキストとデータセグメントの両 方を書き込み可能なメモリにロードします。 NMAGIC OMAGIC と同様に、テキストとデータセグメントは、ヘッダの 直後に続き、連続しています。しかしながら、カーネルは、 読み込み専用メモリにテキストをロードし、テキストの後の 次のページ境界で書き込み可能なメモリにデータをロードし ます。 ZMAGIC カーネルは、必要に応じて、バイナリから個別のページを ロードします。ヘッダ、テキストセグメントとデータセグメ ントは、すべて、リンクエディタによってページサイズの倍 数にパディングされます。カーネルがテキストセグメントか らロードされるページは、読み込み専用ですが、データセグ メントからのページは、書き込み可能です。 a_text テキストセグメントのバイト単位のサイズを含んでいます。 a_data データセグメントのバイト単位のサイズを含んでいます。 a_bss `bss セグメント' のバイト数を含み、データセグメントの後の最初の ブレーク (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 リンクeエディトに必要なポインタのバイトオフセットを含んでい ます。テキストリロケーションオフセットは、テキストセグメント の開始から計算され、データセグメントの開始からのデータリロ ケーションオフセットが計算されます。リンクエディタは、このオ フセットで既に格納されている値を、このリロケーションレコード を使用して計算する新しい値に追加します。 r_symbolnum シンボルテーブル内のシンボル構造体の順序序数 (それは、バイト オフセットではありません) を含んでいます。リンクエディタは、 このシンボルのための絶対アドレスを解決した後に、リロケーショ ン中のポインタにそのアドレスを追加します。(r_extern ビットが クリアであるなら、状況は、異なります。以下を参照。) r_pcrel これが設定されているなら、リンクエディタは、PC 相対アドレス 指定を使用してマシンコード命令の一部であるポインタを更新して いると仮定します。リロケーションされたポインタのアドレスは、 実行中のプログラムがそのポインタを使用するとき、その値に暗黙 的に追加されます。 r_length バイト単位のポインタの長さの 2 を底とする対数を含んでいま す。1 バイトの変位 (displacement) のために 0、2 バイトの変位 (displacement) のために 1、4 バイトの変位 (displacement) の ために 2。 r_extern このリロケーションが外部参照を必要としているなら、設定しま す。リンクエディタは、ポインタを更新するシンボルアドレスを使 用しなければなりません。r_extern ビットがクリアであるなら、 リロケーションは、`local' です。リンクエディタは、シンボルの 値の変更ではなく、さまざまなセグメントのロードアドレスの変更 を反映するようにポインタを更新します (また r_baserel が設定 されている (下記参照) ときを除いて)。この場合に、r_symbolnum フィールドの内容は、n_type 値です (下記参照)。このタイプ フィールドは、リロケーションされたポインタがどのセグメントを 指しているかをリンクエディタに伝えます。 r_baserel 設定されているなら、r_symbolnum フィールドで識別されるような シンボルは、グローバルオフセットテーブル (Global Offset Ta ble) へのオフセットにリロケートされます。実行時に、このオフ セットのグローバルオフセットテーブル (Global Offset Table) のエントリは、シンボルのアドレスに設定されます。 r_jmptable 設定されているなら、r_symbolnum フィールドで識別されるような シンボルは、プロシージャリンクテーブル (Procedure Linkage Table) へのオフセットにリロケートされます。 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 つのサブフィールドに分類されます。リンクエディタは、 `external' シンボルとして設定された N_EXT タイプビットでシン ボルを扱い、他のバイナリファイルからへの参照を許可します。 N_TYPE マスクは、リンクエディタに関心があるビットを選択しま す。 N_UNDF 未定義シンボル。リンクエディタは、このシンボルの絶対 値を決定するために、別のバイナリファイルの同じ名前が ある外部シンボルを位置付けなければなりません。特殊な 場合として、n_value フィールドが 0 以外で、リンクエ ディトにバイナリファイルが、このシンボルを定義してい ないなら、リンクエディタは、n_value と等しいバイトの 量を予約して、このシンボルを bss セグメントのアドレ スに解決します。このシンボルが複数のバイナリファイル で定義されず、バイナリファイルがサイズに一致しないな ら、リンクエディタは、すべてのバイナリに渡って見つか る最大サイズを選択します。 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 ビットは、次の 2 つの値の 1 つを保持しています: 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 を使用するわけではな いので、バイナリが実際のマシンコードを調べずに実行されるか、どのアーキテ クチャであるかを決定することは困難であるかもしれません。マシンの識別子が あったとしても、exec ヘッダのバイト順は、マシンに依存します。 FreeBSD 12.2 June 10, 2010 FreeBSD 12.2