UNIXにおけるアーカイブユーティリティ ar
UNIXの`ar`(アーカイバ)は、複数のファイルをまとめて単一のアーカイブファイルにするためのユーティリティです。現在では、主にリンカが利用する静的リンクライブラリの作成や更新に使われています。`ar`は本来、任意のアーカイブ作成に利用できますが、静的ライブラリ作成以外は、ほとんど`tar`にその役割を譲っています。`ar`は
GNU Binutilsに含まれるプログラムの一つです。
ファイルフォーマットの詳細
`ar`のファイルフォーマットは、
標準化されたものが存在しません。現代的なアーカイブは、BSDとGNUという2つの主要な派生フォーマットをベースにしています。歴史的には、
AIXのようにBSDやGNUとは異なる独自フォーマットを持つ変種も存在しました(例:"Small", "Big", "Coherent")。Debian系の
Linuxディストリビューションで利用されるパッケージファイル".deb"は、BSD/GNU共通の`ar`アーカイブ形式を使用しています。
`ar`が生成するアーカイブは、グローバルヘッダで始まり、その後にファイルヘッダとデータセクションが続きます。データセクションは2バイト単位で区切られ、
奇数バイトで終わる場合は、パディングとして改行文字(`
`)が挿入されます。
Win32以降のMicrosoft Windowsの開発環境におけるライブラリファイル(.lib)も、内部的には`ar`フォーマットを使用しています。
グローバルヘッダ
グローバルヘッダは、マジックアスキー文字列`!<arch>`とそれに続く改行文字(LF)から構成されます。
ファイルヘッダ
ファイルヘッダは、ファイル名、タイムスタンプ、オーナーID、グループID、ファイルモード、ファイルサイズといった情報を含みます。
ファイル名の長さやフォーマットの制限から、GNUとBSDの派生では長いファイル名を格納するための異なる方法が開発されています。
BSDの派生版
BSDの`ar`では、`#1/`という文字列を使用し、その後にファイル名の長さ、実際のファイル名が続きます。
GNUの派生版
GNUの`ar`では、`//`という名前の特別なレコードを利用し、ファイルのデータセクションに複数の拡張ファイル名を格納します。このレコードは、後続のヘッダから参照されます。ヘッダは、レコード`/`を使用して拡張ファイル名を参照します。`/`レコードの後には、拡張ファイル名データセクション内のファイル名の先頭からの十進オフセットが続きます。`//`ファイルのフォーマットは、単なる長いファイル名のリストであり、各フィールドは1つ以上のLFで区切られています。オフセットは文字数であり、`//`ファイル内の行数や文字列数ではありません。
GNUの`ar`は、ファイル名の終端を`/`と認識します。これを利用すると、拡張ファイル名を使用せずにスペースをファイル名に含めることができます。
GNUの`ar`では、特別なファイル名`/`を利用して、直後のデータエントリにシンボルルックアップテーブルを含めることができます。これにより、`ar`ライブラリへのアクセス速度が向上します。シンボルテーブルは、以下の3つの部分で構成されます。
1. 32ビットビッグ
エンディアン整数で表されるテーブルのエントリ数
2. 32ビットビッグ
エンディアン整数の配列で、各シンボルに対して、そのシンボルを含むファイルに対応するヘッダのアーカイブ内オフセットを記録します。
3. 0終端の文字列配列で、各シンボル名が2番目のデータにあるオフセットのリストと対応する順序で並んでいます。
特別なファイル`/`は、特定の終端文字列を持っていません。最後のシンボル名が読み込まれると終了します。
`ranlib`という別のコマンドは、`ar s`の実行と全く同じです。つまり、シンボルルックアップテーブルを追加するだけのコマンドです。
使用例
例えば、`class1.o`、`class2.o`、`class3.o`からなるアーカイブを作成するには、次のコマンドを実行します。
bash
ar rcs libclass.a class1.o class2.o class3.o
`class1.o`、`class2.o`、`class3.o`に依存するプログラムをコンパイルするには、以下のようにします。
bash
cc main.c libclass.a
これは静的リンクの方法ですが、ライブラリを作成せずにプログラムにコンパイルすることもよく行われます。
bash
cc main.c class1.o class2.o class3.o
脚注
関連項目
.deb
アーカイブフォーマット
UNIXユーティリティの一覧
外部リンク
ar: create and maintain library archives –
The Open Group基本仕様書第7号2018年版「シェル及びユーティリティ」
ar(1) – Linux User Commands Manual (en)
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を参照のこと。オンラインでは[1]が利用可能。
ranlib(1) – Linux User Commands Manual (en)
*
Manpage of ranlib - JM Project