Ar (UNIX)

UNIXにおけるarchiver(単にarとしても知られる)とは、複数のファイルを一つのアーカイブにまとめるユーティリティである。こんにちにおいて、arは、一般にリンカが使用する静的リンクされたライブラリの生成や更新にのみ利用される。すなわち、arは任意の目的でアーカイブの生成に利用できるが、静的ライブラリの作成を除いてその用途をほとんどtarに取って代わられた。arはGNU Binutilsに含まれるプログラムである。

ファイルフォーマットの詳細

arのファイルフォーマットは一度も標準化されたことがない。現代的なアーカイブは2つの良く知られた派生物で利用される共通フォーマットが基になっている。すなわちBSDGNUである。

歴史的には、その他変種も存在し、例えばAIX[1]には"Small"[2]、"Big"[3]そして"Coherent"と3つの形式があり、いずれもBSD・GNU共通形式とは全く異なったフォーマットである。

DebianLinuxディストリビューションパッケージである".deb"はBSD・GNU共通フォーマットを採用したarアーカイブである。

arが生成するアーカイブの先頭データにはグローバルヘッダが存在し、その後他ヘッダと格納ファイル本体のデータセクションが続く。

データセクションは2バイト毎に切り詰められる。仮にオフセットが奇数で終端をむかえた場合、'\n'が詰め物として利用される。

Win32以降のMicrosoft Windowsの開発環境のライブラリファイル(.lib)も内部的にarフォーマットを使用している。

グローバルヘッダ

グローバルヘッダはマジックアスキー文字列"!<arch>"を含む単一のフィールドであり、その後、制御文字である単一のラインフィード(LF)が続く。

ファイルヘッダ

以下のような共通フォーマットを持つ。

フィールドの開始オフセット フィールドの終了オフセット フィールド名 フィールドフォーマット
0 15 ファイル名 ASCII
16 27 ファイル改変時のタイムスタンプ 十進数
28 33 UID 十進数
34 39 GID 十進数
40 47 ファイルモード 八進数
48 57 ファイルサイズ(バイト) 十進数
58 59 マジックナンバー 0x60 0x0A

ファイル名の長さやフォーマットの制限により、GNUとBSDの派生双方で長いファイル名を格納する方法(ただし両者で異なる)が開発されている。

BSDの派生版

BSD arは、文字列"#1/"を配置し、このことにより拡張されたファイル名を格納できる。この文字列の後にファイル名のフィールドにあるファイル名の長さのデータが続き、さらにファイルヘッダの実ファイル名が添加される。

GNUの派生版

GNU arは"//"という名前のレコードを持ち、ファイルのデータセクション上に複数の拡張型ファイル名を格納している。このレコードは将来のヘッダ参照用に確保されている。ヘッダは、レコード"/"の格納によって拡張されたファイル名を参照する。このレコードの後に拡張ファイル名データセクション上に存在するファイル名の先頭十進オフセットが続く。この"//"ファイルのフォーマット自体は単なるロングファイルネームのリストである。各フィールドは1つ以上の文字列LFによってそれぞれ分離される。十進オフセットは文字数であり、"//"ファイル内にある行数や文字列数ではないことに注意しておきたい。

GNU arは'/'をファイル名の終端と認識する。すなわち、これを利用すれば拡張ファイル名を利用することなく、スペースを使用することができる。

GNU arは特殊なファイル名"/"を利用することにより、その直後のデータエントリにarライブラリのアクセス速度を向上するのに利用されるシンボルルックアップテーブルを含めることができる。このシンボルテーブルは隣接データとして同時に記録される以下3つの部分からなる。

  1. 32ビットビッグエンディアン整数で与えられるテーブル上のエントリー数
  2. 32ビットビッグエンディアン整数の集まり。各シンボル毎に、シンボルを含むファイル用のヘッダのアーカイブ内の位置を1つずつ記録する。
  3. 終端が0である文字列の集まり。それぞれシンボル名であり、2番目のデータにある位置のリストとして、同一の順番から成る。

特殊なファイル"/"は、特定の終端文字列を持たない。最後のシンボル名がひとたび読み込まれれば、そこで終了すると仮定される。

別のコマンドとしてranlibというものがある。これはar sを実行した場合と完全に等価である。すなわちシンボルルックアップテーブルを追加するだけのコマンドである。

使用例

例えば、ファイルclass1.o, class2.o, class3.oからなるアーカイブを作成するには、次のコマンドを実行する。

ar rcs libclass.a class1.o class2.o class3.o

class1.o, class2.o, and class3.oに依存するプログラムをコンパイルするには次を実行する。

cc main.c libclass.a

以上が静的リンクの方法だが、以下のようにライブラリを作成することなくプログラムにコンパイルすることもよく行われる。

cc main.c class1.o class2.o class3.o

脚注

  1. ^ ar Command”. IBM. 2011年5月27日閲覧。
  2. ^ ar File Format (Small)”. IBM. 2011年5月27日閲覧。
  3. ^ ar File Format (Big)”. IBM. 2011年5月27日閲覧。

関連項目

外部リンク