Ar (UNIX)

UNIXにおけるarchiver（単にarとしても知られる）とは、複数のファイルを一つのアーカイブにまとめるユーティリティである。こんにちにおいて、は、一般にリンカが使用する静的リンクされたライブラリの生成や更新にのみ利用される。すなわち、arは任意の目的でアーカイブの生成に利用できるが、静的ライブラリの作成を除いてその用途をほとんどtarに取って代わられた。arはGNU Binutilsに含まれるプログラムである。
ファイルフォーマットの詳細.
arのファイルフォーマットは一度も標準化されたことがない。現代的なアーカイブは2つの良く知られた派生物で利用される共通フォーマットが基になっている。すなわちBSDとGNUである。
歴史的には、その他変種も存在し、例えばAIXには"Small"、"Big"そして"Coherent"と3つの形式があり、いずれもBSD・GNU共通形式とは全く異なったフォーマットである。
Debian系Linuxディストリビューションのパッケージである".deb"はBSD・GNU共通フォーマットを採用したarアーカイブである。
arが生成するアーカイブの先頭データにはグローバルヘッダが存在し、その後他ヘッダと格納ファイル本体のデータセクションが続く。
データセクションは2バイト毎に切り詰められる。仮にオフセットが奇数で終端をむかえた場合、'\n'が詰め物として利用される。
Win32以降のMicrosoft Windowsの開発環境のライブラリファイル(.lib)も内部的にarフォーマットを使用している。
グローバルヘッダ.
グローバルヘッダはマジックアスキー文字列"!<arch>"を含む単一のフィールドであり、その後、制御文字である単一のラインフィード（LF）が続く。
ファイルヘッダ.
以下のような共通フォーマットを持つ。
ファイル名の長さやフォーマットの制限により、GNUとBSDの派生双方で長いファイル名を格納する方法（ただし両者で異なる）が開発されている。
BSDの派生版.
BSD arは、文字列"#1/"を配置し、このことにより拡張されたファイル名を格納できる。この文字列の後にファイル名のフィールドにあるファイル名の長さのデータが続き、さらにファイルヘッダの実ファイル名が添加される。
GNUの派生版.
GNU arは"//"という名前のレコードを持ち、ファイルのデータセクション上に複数の拡張型ファイル名を格納している。このレコードは将来のヘッダ参照用に確保されている。ヘッダは、レコード"/"の格納によって拡張されたファイル名を参照する。このレコードの後に拡張ファイル名データセクション上に存在するファイル名の先頭十進オフセットが続く。この"//"ファイルのフォーマット自体は単なるロングファイルネームのリストである。各フィールドは1つ以上の文字列LFによってそれぞれ分離される。十進オフセットは文字数であり、"//"ファイル内にある行数や文字列数ではないことに注意しておきたい。
GNU arは'/'をファイル名の終端と認識する。すなわち、これを利用すれば拡張ファイル名を利用することなく、スペースを使用することができる。
GNU arは特殊なファイル名"/"を利用することにより、その直後のデータエントリにarライブラリのアクセス速度を向上するのに利用されるシンボルルックアップテーブルを含めることができる。このシンボルテーブルは隣接データとして同時に記録される以下3つの部分からなる。
特殊なファイル"/"は、特定の終端文字列を持たない。最後のシンボル名がひとたび読み込まれれば、そこで終了すると仮定される。
別のコマンドとしてというものがある。これはcodice_1を実行した場合と完全に等価である。すなわちシンボルルックアップテーブルを追加するだけのコマンドである。
使用例.
例えば、ファイル, , からなるアーカイブを作成するには、次のコマンドを実行する。
 ar rcs libclass.a class1.o class2.o class3.o
, , and に依存するプログラムをコンパイルするには次を実行する。
 cc main.c libclass.a
以上が静的リンクの方法だが、以下のようにライブラリを作成することなくプログラムにコンパイルすることもよく行われる。
 cc main.c class1.o class2.o class3.o