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）が続く。

 ファイルヘッダ 
以下のような共通フォーマットを持つ。

フィールドの開始オフセットフィールドの終了オフセットフィールド名フィールドフォーマット015ファイル名ASCII1627ファイル改変時のタイムスタンプ十進数2833UID十進数3439GID十進数4047ファイルモード八進数4857ファイルサイズ（バイト）十進数5859マジックナンバー0x60 0x0A

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

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

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

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

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

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

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

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

 使用例 
例えば、ファイル, , からなるアーカイブを作成するには、次のコマンドを実行する。
 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

 脚注 

 関連項目 
 .deb
 アーカイブフォーマット
 UNIXユーティリティの一覧

 外部リンク 


 Manpage of ar - JM Project
 FreeBSDマニュアルページ
 UNIX Seventh Editionのar用マニュアルページ
 The 32-bit PA-RISC Run-time Architecture Document, HP-UX 11.0 Version 1.0, Hewlett-Packard, 1997.Chapter 4: Relocatable Librariesを参照のこと。オンラインではが利用可能（devresource.hp.com、PDF）。

 Manpage of ranlib - JM Project

Category:データ圧縮規格
Category:解凍ソフト
Category:標準UNIXプログラム
Category:GNUプロジェクトのソフトウェア
Category:BSD
Category:UNIXプログラミングツール
Category:ユーティリティソフトウェア