AR(5)

名称
ar - アーカイブ (ライブラリ) ファイルフォーマット

書式
<ar.h>

解説
アーカイブコマンド ar は複数のファイルをひとつにまとめます。 アーカイブは主にリンクエディタ ld(1) を使ってロードするための オブジェクトファイルのライブラリとして使用します。

ar によって作成されたファイルは ``マジック'' ストリング "!<arch>\n" で 始まっています。 アーカイブの残りはオブジェクトからなり、その各々はファイルのヘッダと ファイル名 (オプション) とファイルの中身から構成されます。 ヘッダは異なるマシンアーキテクチャ間で互換性のあるもので、 ファイルの内容が印字可能なものであれば アーカイブそのものも印字可能となります。

ヘッダは、可変長の ASCII のフィールド 6 つとそれに続く2 文字の終端から構成されます。 フィールドはオブジェクトの名前 (16 文字)、 ファイルの最終更新時間 (12 文字)、 ユーザとグループ ID (各々 6 文字)、 ファイルモード (8文字)、 それにファイルサイズ (10 文字) です。 全ての数字フィールドは 10 進数ですが、ファイルモードだけは 8 進数です。

更新時間はファイルの st_mtime フィールドです。すなわち 基準時点 (epoch) からの時間 CUT 秒です。 ユーザ ID とグループ ID はファイルの st_uid と st_gid フィールドです。 ファイルモードはファイルの st_mode フィールドです。 ファイルサイズはファイルの st_size フィールドです。 最後の 2 バイトは文字列 "`\n" となります。

名前のフィールドに限りあふれることが考えられるため、以下のよ うに対応しています。 もしファイル名の長さが 16 文字を超えるかスペースを含む場合は、 名前のフィールドには文字列 "#1/" に続いてその名前の ASCII での長さが書き込まれます。 ファイルサイズ (アーカイブヘッダに書き込まれているもの) には その名前の長さが加算されます。 そして名前はアーカイブヘッダの直後に書かれます。

これらのフィールドにおいて使用されていない部分には 空白文字が書き込まれます。 もしフィールドにその最長の文字数が書き込まれていると、 フィールドの間の区切りはないことになります。

アーカイブ中のオブジェクトは常に偶数バイトの長さとなります。 ファイルの長さが奇数バイトである場合は 改行 (``\n'') 文字でパディングされます。 その場合、ヘッダ中のファイルサイズにはパディングの分は反映されません。

関連項目
ar(1), stat(2)

歴史
これまでに少なくとも 4 つの ar フォーマットがありました。 最初のものは先頭の ``マジック'' ナンバー 0177555 (int 型で書かれていた) で示されていました。 これらのアーカイブはほとんどが 16 ビットマシン上で作られたものであり、 ヘッダは 5 つのフィールドから構成されていました。 ヘッダのフィールドにはオブジェクト名 (8 文字)、 ファイルの最終更新時間 (long 型)、 ユーザ ID (char 型)、 ファイルモード (char 型)、 そしてファイルサイズ (符号なし int 型) がありました。 ファイルはバイト数で偶数長となるようにパディングされていました。

2 つ目のものは先頭の ``マジック'' ナンバー 0177545 (int 型で書かれていた) で示されていました。 これらのアーカイブは 16 もしくは 32 ビットマシンで作られたものであり、 ヘッダは 6 つのフィールドから構成されていました。 フィールドにはオブジェクト名 (14 文字)、 ファイルの最終更新時間 (long 型)、 ユーザおよびグループ ID (各々 char 型)、 ファイルモード (int 型)、 そしてファイルサイズ (long 型) がありました。 ファイルはバイト数で偶数長となるようにパディングされていました。

現在のアーカイブフォーマット (長い名前とスペースを含む名前をサポートしていないもの) は 4.0BSD で導入されました。 ヘッダは現在のフォーマットと同じですが、 16 文字以上の名前は切り捨てられ、 スペースを含む名前 (および名前の末尾にスペースがつくもの) はサポートされていません。 これらの理由により、このフォーマットに前述の拡張がなされました。 現在のこのフォーマットは 4.4BSD で最初に出現しました。

互換性
現在アーカイブフォーマットは標準では規定されていません。 AT&T UNIX では、昔から上述のいずれとも異なるフォーマットの アーカイブで配布されています。