AR(5) | FreeBSD File Formats Manual | AR(5) |
書式
#include < ar.h>解説
ar(1) アーカイブは、 ar(1) と ranlib(1) ユーティリティによって作成され管理されます。これらのアーカイブは、通常プログラムオブジェクトのライブラリを保持するためにプログラム開発の間に使用されます。 ar(1) アーカイブは、単一のオペレーティングシステムのファイルに含まれています。このマニュアルページは、 ar(1) アーカイブ形式の 2 つの変異型を文書化しています: BSD アーカイブ形式と SVR4/GNU アーカイブ形式です。
両方の変異型では、アーカイブファイルは、ASCII のラインフィード文字が続く、 7 つの ASCII 文字‘ !<arch>
’の識別バイトシーケンスで始まります (ヘッダファイル < ar.h> の定数“ARMAG”を参照してください)。
アーカイブメンバは、初期の識別バイトシーケンスが続きます。各アーカイブメンバは、メンバに関連しているファイル属性を説明する固定サイズのヘッダが前に置かれます。
アーカイブヘッダ
アーカイブヘッダは、それに続くアーカイブメンバのためのファイル属性を説明しています。 ar(5) 形式は、限られた数の属性のみをサポートしています: ファイル名、ファイル作成のタイムスタンプ、クリエイタの uid と gid、ファイルモードとファイルサイズです。アーカイブヘッダは、アーカイブファイルの偶数のバイトオフセットに置かれます。アーカイブメンバのためのデータが奇数バイトで終わるなら、値 0x0A の詰め物バイトは、偶数のバイトオフセットに次のアーカイブヘッダを位置付けるために使用されます。
アーカイブヘッダは、次の固定サイズのフィールドを構成します:
- ar_name
- (16 バイト) アーカイブメンバのファイル名。このフィールドの形式は、BSD と SVR4/GNU 形式の間で異なり、下記のセクション 「ファイル名の表現」 でより詳細に説明されています。
- ar_date
- (12 バイト) 10 進数としてエンコードされた、(UNIX) 基準時点以来の秒単位のメンバのためのファイル更新時刻。
- ar_uid
- (6 バイト) uid は、10 進数としてエンコードされた、アーカイブメンバに関連しています。
- ar_gid
- (6 バイト) gid は、10 進数としてエンコードされた、アーカイブメンバに関連しています。
- ar_mode
- (8 バイト) 8 進数としてエンコードされた、アーカイブメンバのためのファイルモード。
- ar_size
- (10 バイト) SVR4/GNU アーカイブ形式では、このフィールドは、10 進数としてエンコードされた、アーカイブメンバのバイト単位のサイズを保持しています。 BSD アーカイブ形式で、短いファイル名に関して、このフィールドは、10 進数としてエンコードされた、アーカイブメンバのバイト単位のサイズを保持しています。長いファイル名に関して、 (下記の 「ファイル名の表現」を参照) そのフィールドは、10 進数としてエンコードされた、アーカイブメンバとそのファイル名の結合されたサイズを含んでいます。
- ar_fmag
- (2 バイト) このフィールドは、ヘッダの終りをマークし、それぞれ、値 0x96 と 0x0A がある 2 バイトを保持しています。
アーカイブヘッダのフィールドの未使用のバイトは、値 0x20 に設定されます。
ファイル名の表現
BSD と SVR4/GNU の変異型は、メンバのためのファイル名をエンコードするために異なったスキーム (scheme) を使用します。- BSD
-
最大 16 バイト長で、埋め込まれた空白を含まないファイル名は、直接アーカイブヘッダの
ar_name フィールドに格納されます。 16 バイトより長いか、または埋め込まれた空白を含むファイル名は、アーカイブヘッダの直後に格納され、アーカイブヘッダの
ar_name フィールドは、文字列“#1/”に設定され、ファイル名に必要であるバイト数の 10 進表現が続きます。さらに、アーカイブヘッダの
ar_size フィールドは、アーカイブメンバとファイル名の結合したサイズの 10 進表現に設定されます。メンバのファイル内容は、さらなる詰め物なしで、ファイル名に続きます。
例として、メンバのためのファイル名が“A B”であり、その内容が文字列“C D”であったなら、ヘッダの ar_name フィールドは、“
#1/3
”を含み、ヘッダの ar_size フィールドは、“6
”を含み、ヘッダの直後に続くバイトは、0x41, 0x20, 0x42, 0x43, 0x20 と 0x44 (ASCII “A BC D”) となるでしょう。 - SVR4/GNU
-
最大 15 文字長のファイル名は、ヘッダの
ar_name フィールドに直接格納され、“
/
”文字で終了します。ファイル名が ar_name フィールドのための空間に適合するより大きいなら、実際のファイル名は、アーカイブ文字列テーブル (下記の 「アーカイブシンボルテーブル」参照) に保持され、文字列テーブルでのファイル名の 10 進数オフセットは、“
/
”文字が前に置かれた、 ar_name フィールドに格納されます。例として、実際のファイル名がアーカイブ文字列テーブルのオフセット 768 に格納されているなら、ヘッダの ar_name フィールドは、文字列“/768”を含むます。
特別のアーカイブメンバ
次ののアーカイブメンバは、特別です。-
“
/
” -
アーカイブ形式の SVR4/GNU 変異型では、名前“
/
”があるアーカイブメンバは、アーカイブシンボルテーブルを意味します。存在しているなら、このメンバは、アーカイブの本当に最初のメンバになります。 -
“
//
” -
アーカイブ形式の SVR4/GNU 変異型では、名前“
//
”があるアーカイブメンバは、アーカイブ文字列テーブルを意味します。この特別のメンバは、ヘッダのファイル名フィールドに底号しないファイル名を保持するために使用されます (上記の 「ファイル名の表現」を参照してください。) 存在しているなら、このメンバは、アーカイブシンボルテーブルが存在しているなら、アーカイブシンボルテーブルの直後に続き、そうでなければ、最初のメンバです。 -
“
__.SYMDEF
” - この特別のメンバは、アーカイブ形式の BSD 変異型のアーカイブシンボルテーブルを含みます。存在しているなら、このメンバは、アーカイブの本当の最初のメンバとなります
アーカイブ文字列テーブル
アーカイブ文字列テーブルは、アーカイブヘッダの ar_name フィールドの制約に適合することができない大きなファイル名を保持するために SVR4/GNU アーカイブ形式で使用されます。アーカイブ文字列テーブルは、ファイル名のシーケンスを含んでいます。アーカイブ文字列テーブルの各ファイル名は、バイト列 0x2F、0x0A (ASCII 文字列“/\n”) で終了します。隣接したファイル名を区切るための詰め物は、使用されません。アーカイブシンボルテーブル
アーカイブシンボルテーブルは、アーカイブと対応するアーカイブメンバで定義されたプログラムシンボルの間のマッピングを提供することによってリンクの編集を早くするために使用されます。アーカイブシンボルテーブルは、 ranlib(1) ユーティリティによって管理されます。アーカイブシンボルテーブルの形式は、次の通りです:
- BSD
-
BSD アーカイブ形式では、アーカイブシンボルテーブルは、2 つの部分から成っています:
struct ranlib の配列を含む部分と、シンボル文字列テーブルを含む部分が後に続きます。 BSD 形式アーカイブシンボルテーブルを構成する構造体のサイズと配置は、マシン依存です。
struct ranlib 記述子を含む部分は、C の long 値としてエンコードされた struct ranlib 記述子の配列のバイト単位のサイズを含んでいるフィールドで始まります。
struct ranlib 記述子の配列が、サイズフィールドに続きます。各 struct ranlib 記述子は、1 つのシンボルを記述しています。
struct ranlib 記述子は、2 つのフィールドから成ります:
- ran_strx
- (C long) このフィールドは、シンボル文字列テーブルのシンボル名の 0 ベースのオフセットを含んでいます。
- ran_off
- (C long) このフィールドは、シンボルを定義するアーカイブメンバのためのアーカイブヘッダへのファイルのオフセットです。
シンボル文字列テーブルを含む部分は、C の long 値としてエンコードされた文字列テーブルのバイト単位のサイズを含むフィールドで始まります。この文字列テーブルは、サイズフィールドに続き、シンボルテーブルのシンボルのためのヌル文字で終了する文字列を含んでいます。
- SVR4/GNU
-
SVR4/GNU アーカイブ形式では、アーカイブシンボルテーブルは、アーカイブシンボルテーブルに含まれるエントリの数を含む 4 バイトのバイナリ値で始まります。このエントリのカウントは、最初に最上位のバイトに格納されます。
次に、 count の 4 バイトの数値、最初の各格納された最上位のバイトがあります。各数値は、対応するシンボルテーブルエントリのためのアーカイブファイルのメンバのためにアーカイブヘッダへのバイナリのオフセットです。
バイナリのオフセット値の後に、対応するシンボルテーブルエントリのためのシンボル名を保持している、 count のヌル文字で終了する文字列のシーケンスがあります。
規格の順守
ar(1) アーカイブ形式は、現在、規格によって明記されていません。このマニュアルページは、 4.4BSD と UNIX SVR4 オペレーティングシステムリリースによって使用される ar(1) アーカイブ形式を文書化しています。
November 28, 2010 | FreeBSD |