ar (Unix)

ar
原作者ケン・トンプソンデニス・リッチーAT&Tベル研究所
開発者さまざまなオープンソースおよび商用開発者
初回リリース1971年11月3日 (1971年11月3日
書かれたC
オペレーティング·システムUnixUnixライクVPlan 9Inferno
プラットフォームクロスプラットフォーム
タイプ指示
ライセンスプラン9: MITライセンス
アーカイバ形式
ファイル名拡張子
.a , .lib , .ar [ 1 ]
インターネットメディアの種類
アプリケーション/x-アーカイブ[ 1 ]
魔法の数字!<アーチ>
フォーマットの種類アーカイブ形式
コンテナ用通常はオブジェクトファイル.o
標準標準化されていないため、いくつかのバリエーションが存在する
オープンフォーマット?はい[ 2 ]

ar(アーカイバ)は、複数のファイルを単一のアーカイブファイル(つまりファイルアーカイバ)として管理するためのシェルコマンドです。リンクエディタやリンカが使用する静的ライブラリファイルの作成と更新、およびDebian Linuxディストリビューション用のdeb形式のパッケージの生成によく使用されます。あらゆる目的のアーカイブ作成に使用できますが、静的ライブラリ以外の目的では、主にアーカイバに置き換えられています。 [ 3 ]tar

このコマンドは元々Unix向けに開発されたものですが、Unixベースのシステムで広く利用でき、他のプラットフォームでも同様のコマンドが利用可能です。実装はGNU Binutilsに含まれています。[ 2 ]

ファイル形式

.deb ファイルのファイル構造の例を示す図

使用して生成されるファイルの形式はar標準化されていません。[ 4 ] [ 5 ]

最初のフォーマットはUnixの初版[ 6 ]で登場し、 Unixバージョン6まで使用されました。[ 7 ] [ 4 ] Unixバージョン7ではそのフォーマットの修正版があり、[ 8 ] [ 4 ]これはUNIX System III [ 9 ]PDP-11上のUNIX System Vでも使用されました。[ 10 ]

PDP-11以外のプロセッサ上のSystem Vの最初のリリースで新しいフォーマットが導入されました。[ 11 ]

現代のアーカイブは、ほとんどのシステムでは、BSD [ 4 ] (当初はa.outファイルに使用)とUNIX System Vリリース2以降[ 12 ](当初はCOFFファイルに使用され、後にELFファイルに使用)の2つの主な変種を持つ共通フォーマットに基づいており、 GNU [ 13 ]Windowsでも使用されています。AIXには独自のフォーマット(small [ 14 ]とbig [ 15 ])があり、Coherentにも同様のものがあり、これらのフォーマットは共通フォーマットとは大きく異なります。

構造

アーカイブファイルは、ファイルの種類を識別するヘッダーで始まり、その後に各ファイルのセクションが続きます。各ファイルのセクションは、ヘッダーとそれに続くファイルの内容で構成されます。ヘッダーは、印刷可能なASCII文字と改行のみで構成されます。実際、テキストファイルのみを含むアーカイブもテキストファイルです。

格納されているファイルの内容は偶数バイト境界から始まります。必要に応じて、ファイル間にパディングとして改行が挿入されます。ただし、格納されるサイズはパディングを除いたサイズです。[ 16 ]

アーカイブヘッダー

最初のヘッダー (ファイル署名とも呼ばれます) は、ASCII 文字列とそれに続く単一の改行文字 (0x0A) をエンコードするマジック ナンバーです。!<arch>

含まれるファイルヘッダー

各ファイルの先頭には、ファイルに関する情報を含むヘッダーが付きます。一般的な形式は次のとおりです。数値はASCIIでエンコードされ、すべての値の右側はスペース(0x20)で埋められます。

オフセット 長さ コンテンツ 形式
0 16 ファイル識別子 アスキー
16 12 ファイル変更タイムスタンプ(秒単位) 小数点
28 6 所有者ID 小数点
34 6 グループID 小数点
40 8 ファイルモード(タイプと権限) 8進数
48 10 ファイルサイズ(バイト単位) 小数点
58 2 エンディングキャラクター 0x60 0x0A

変種

次のような問題に対処するために、コマンドのバリエーションが開発されました。

ファイル名の長さ制限
BSD および System V/GNU の派生版では、長いファイル名を保存するための異なる方法が考案されました。
グローバルシンボルテーブル
多くの実装では、アーカイブ全体をスキャンしてシンボルを探すことなく高速にリンクするためのグローバルシンボルテーブル(armap、ディレクトリ、インデックスとも呼ばれる)が組み込まれています。POSIXはこの機能を認識しており、実装には-sこれを更新するためのオプションを備えることを要求しています。ほとんどの実装では、これをファイルの最初のエントリに配置しています。[ 17 ]
2038年問題
共通フォーマットはこの問題のリスクはありませんが、多くの実装はその年に障害が発生する危険性があります。

BSD

BSD実装では、ファイル名の右側にASCIIスペースが埋め込まれて保存されます。これにより、ファイル名内のスペースに関する問題が発生します。4.4BSD 実装では、ファイル名フィールドに文字列「#1/」に続いてファイル名の長さを格納し、実際のファイル名をデータセクションの先頭に格納することで、拡張ファイル名を保存します。[ 4 ]

そのBSD実装では伝統的に、グローバルシンボル検索テーブルの構築を処理せず、このタスクを別のユーティリティに委任しています。 [ 18 ]ranlibこのユーティリティは、最初のアーカイブメンバーとしてという名前のアーキテクチャ固有のファイルを挿入します。 [ 19 ]一部の派生バージョンでは、ソートされたバージョンであることを示すために、名前の後にスペースと「SORTED」が付きます。[ 20 ] Darwinにはと呼ばれる64ビットのバリアントが存在します。 __.SYMDEF__.SYMDEF_64

POSIXに準拠するため、新しいBSD実装で-sは の代わりに オプションをサポートしていますranlib。特にFreeBSDはSYMDEFテーブル形式を廃止し、System Vスタイルのテーブルを採用しました。[ 21 ]

システムV/GNU

ファイル名にスペースを含めるため、System V実装ではファイルの末尾にスラッシュ ('/') を使用します。これにより、ファイル名は15文字までに制限されます。15文字を超えるASCII文字のファイル名は、スラッシュ ('/') に続けてインデックスファイル内のファイル名の開始位置または開始位置の10進文字オフセットを続けたインデックスに置き換えられます。インデックスファイルは「//」という名前で、通常はアーカイブの2番目のエントリで、常に最初のエントリであるシンボルテーブルに次ぐ位置にあります。この「//」ファイル自体の形式は、1つ以上のLF文字で区切られた長いファイル名のリストです。LF文字はファイル名の一部には使用できません。GNU版では、ファイル名は「/」で終了し、LFは使用されません。

System V実装では、特別なファイル名「/」を使用して、後続のデータエントリにシンボルルックアップテーブルが含まれていることを示します。このシンボルルックアップテーブルは、arライブラリでアクセスを高速化するために使用されます。このシンボルテーブルは3つの部分で構成され、連続したデータとしてまとめて記録されます。

  1. テーブル内のエントリ数を示す 32 ビットのビッグ エンディアン整数。
  2. 32ビットビッグエンディアン整数のセット。各シンボルごとに1つずつあり、そのシンボルを含むファイルのヘッダーのアーカイブ内の位置を記録します。
  3. ゼロ終端文字列のセット。各文字列はシンボル名であり、パート2の位置リストと同じ順序で出現します。

一部のSystem Vシステムではこの形式は使用されません。HP -UX 11.0などのオペレーティングシステムでは、この情報はSOMファイル形式に基づくデータ構造に保存されます。

特殊ファイル「/」は特定のシーケンスで終了しません。最後のシンボル名が読み取られると終了と見なされます。

4GiBのファイルサイズ制限を克服するために、Solaris 11.2やGNUなどの一部のオペレーティングシステムでは、バリアントルックアップテーブルが使用されています。シンボルルックアップテーブルでは、32ビット整数ではなく64ビット整数が使用されています。このテーブルの識別子として、文字列「/」の代わりに「/SYM64/」が使用されています[ 22 ]

ウィンドウズ

Windows (PE/COFF)版SysV/GNU版に基づいています。最初のエントリ「/」はSysV/GNUのシンボルテーブルと同じレイアウトです。2番目のエントリは別の「/」で、拡張シンボル相互参照テーブルを格納するMicrosoft拡張です。これはソートされており、リトルエンディアン整数を使用します。[ 5 ] [ 23 ] 3番目のエントリはSysV/GNUと同様に、オプションの「//」ロングネームデータです。[ 24 ]

薄いアーカイブ

GNU binutilsElfutilsの実装には、マジックナンバー を持つ「シンアーカイブ」形式が追加されています。シンアーカイブには、シンボルテーブルとファイルへの参照のみが含まれます。このファイル形式は基本的にSystem V形式のアーカイブであり、すべてのファイルはデータセクションなしで保存されます。すべてのファイル名は「長い」ファイル名として保存され、シンボリックリンク!<thin>のように解決されます。[ 25 ]

次のコマンドは、オブジェクト ファイルclass1.oclass2.oclass3.oを含むアーカイブlibclass.aを作成します。

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

リンカーはldアーカイブファイルからオブジェクトコードを読み取ることができます。次の例は、アーカイブlibclass.a-lclassとして指定)がmain.oのオブジェクトコードとリンクされる様子を示しています。

ld main.o -lclass 

参照

参考文献

  1. ^ a b “application/x-archive” . 2019年12月8日時点のオリジナルよりアーカイブ2019年3月11日閲覧。
  2. ^ a b「ar(1) – Linux manページ」 。 2013年10月3日閲覧
  3. ^ 「静的ライブラリ」 TLDP . 2013年10月3日閲覧
  4. ^ a b c d e NET/2 arファイル形式のマニュアルページ
  5. ^ a b Levine, John R. (2000) [1999年10月]. 「第6章 ライブラリ」 .リンカーとローダー. モルガン・カウフマン・シリーズ ソフトウェア工学とプログラミング (第1版). サンフランシスコ, 米国: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC  42413382 . 2012年12月5日にオリジナルからアーカイブ2020年1月12日閲覧。コード: [1] [2]エラッタ: [3]
  6. ^ 「archive(5) - Unix First Editionマニュアルページ」
  7. ^ 「unix-6th マニュアルのセクション 5 のアーカイブ ページ」
  8. ^ "V7/usr/include/ar.h" .
  9. ^ Unixユーザーズマニュアル、リリース3.0 (PDF) .ベル研究所. 1980年6月 . AR(5).
  10. ^ユーザーズマニュアル、System V (PDF) . Western Electric . 1983年1月. AR(4) (PDP-11のみ).
  11. ^ユーザーズマニュアル、System V (PDF) . Western Electric . 1983年1月. AR(4) (PDP-11では非対応)。
  12. ^ UNIX System V プログラマリファレンスマニュアル DECプロセッサ(PDF) . AT&T Technogies . 1984年4月. AR(4) (PDP-11では非対応)。
  13. ^ "binutils ar.h" .
  14. ^ 「ar ファイル形式 (小)」 . IBM .
  15. ^ 「ar ファイル形式 (Big)」 . IBM .
  16. ^ "ar.h" . www.unix.com . UNIXおよびLinuxフォーラム。
  17. ^ar  – シェルおよびユーティリティリファレンス、 The Single UNIX 仕様、バージョン5、 The Open Group
  18. ^ 「NET/2 ranlib ユーティリティのマニュアル ページ」
  19. ^ 「NET/2 ranlib ファイル形式のマニュアル ページ」
  20. ^ “Libc/include/ranlib.h at Libc-320 - apple-oss-distributions/Libc” . Github . 2020年2月10日閲覧
  21. ^ar(5)  –  FreeBSDファイルフォーマットマニュアル
  22. ^ "ar.h(3HEAD)" . docs.oracle.com . Oracle Corporation. 2014年11月11日. 2018年11月14日閲覧
  23. ^ Pietrek, Matt (1998年4月)、「Under The Hood」Microsoft Systems Journal 、 2007年6月24日時点のオリジナルよりアーカイブ、 2014年8月23日閲覧。
  24. ^ “llvm-mirror/llvm: archive.cpp (フォーマット検出)” . GitHub . 2020年2月10日閲覧
  25. ^ "ar" . GNU バイナリユーティリティ.