arは、 archiverの略で、複数のファイルを単一のアーカイブ ファイル(つまりファイル アーカイバ) として管理するためのシェルコマンドです。リンク エディタやリンカが使用する静的ライブラリファイルの作成と更新、およびDebian Linux ディストリビューション用のdeb フォーマットパッケージの生成によく使用されます。あらゆる目的でアーカイブを作成するために使用できますが、静的ライブラリ以外の目的ではにほぼ置き換えられています。 [ 3 ]tar
元々はUnix向けに開発されたこのコマンドは、Unixベースのシステムで広く利用でき、他のプラットフォームでも同様のコマンドが利用可能です。GNU Binutilsには実装が含まれています。[ 2 ]

を使用した結果生成されるファイルの形式はar標準化されていませんが、ほとんどのバリエーションはマニュアルページar(5) または少なくともヘッダーファイルで文書化されていますar.h。[ 4 ] [ 5 ]
ED FF(0177555)でした。[ 4 ] Unixバージョン7にはそのフォーマットの修正版があり、[ 8 ] [ 4 ] UNIX System III [ 9 ]やPDP-11上のUNIX System Vでも使用されました。[ 10 ]PDP-11以外のプロセッサでSystem Vの最初のリリースで新しいフォーマットが導入されました。[ 11 ]このフォーマットにはマジックナンバー0177545がありました。[ 4 ]
現代のアーカイブは、ほとんどのシステムにおいて、BSD [ 4 ] (当初はa.outファイルに使用) と UNIX System V リリース 2 以降[ 12 ] (当初はCOFFファイルに使用され、後にELFファイルに使用) という 2 つの主要なバリアントを持つ共通フォーマットに基づいており、 GNU [ 13 ] [ 14 ]やWindowsでも使用されています。
AIX には独自のフォーマット (small [ 15 ]と big [ 16 ] ) があり、Coherent にも独自のフォーマットがあります。これらのフォーマットは、一般的なフォーマットとは大きく異なります。通常のエントリごとのヘッダーに加えて、AIX フォーマットにはグローバル ヘッダーが含まれており、これらによってアーカイブを二重リンク リストとして扱うことができます。[ 17 ]
アーカイブファイルは、ファイルの種類を識別するヘッダーで始まり、その後に各ファイルに対応するセクションが続きます。各ファイルセクションは、ヘッダーとファイルの内容で構成されます。ヘッダーは、印刷可能なASCII文字と改行のみで構成されます。実際、テキストファイルのみを含むアーカイブもテキストファイルです。
格納されているファイルの内容は偶数バイト境界から始まります。必要に応じて、ファイル間にパディングとして改行が挿入されます。ただし、格納されるサイズはパディングを除いたサイズを反映しています。[ 18 ]
最初のヘッダー、別名ファイル署名は、ASCII文字列とそれに続く単一の改行文字(0x0A)をエンコードしたマジックナンバーです。!<arch>
各ファイルには、ファイルに関する情報を含むヘッダーが先頭に付いています。一般的な形式は次のとおりです。数値はASCIIでエンコードされ、すべての値はスペース(0x20)で右側が埋められます。
このコマンドのバリエーションは、以下のような問題に対処するために開発されました。
-sそれを更新するためのオプションがあることを要求しています。ほとんどの実装では、それを最初のファイルエントリに配置します。[ 19 ]With the standard name field, the 4.0BSD implementation stores file names right-padded with ASCII spaces (0x20). Only file names that are up to 16 bytes long and contains no spaces are put in the standard field. For all other file names, it places the string "#1/" followed by the file name length (decimal) in the standard name field, then stores the real file name in front of the data section.[4][14]
The BSD implementation traditionally does not handle the building of a global symbol lookup table, and delegates this task to a separate utility, ranlib,[20] which inserts an architecture-specific[a] file named __.SYMDEF as first archive member.[21] Some descendants put a space and "SORTED" after the name to indicate a sorted version.[22] A 64-bit variant called __.SYMDEF_64 exists on Darwin.
To conform to POSIX, newer BSD implementations support the -s option instead of ranlib. FreeBSD in particular ditched the SYMDEF table format and embraced the System V style table.[14]
To allow spaces in file names, the System V Revision 2 (SVR2) implementation uses a slash ('/') to mark the end of the file. This limits the file name to 15 chars. Filenames longer than 15 ASCII chars are replaced by an index, represented by a slash ('/') followed by the decimal character offset in the indexfile (also called the "archive stream table), pointing to the location of the start of the name (for example, /768 refers to a name that starts at offset 768 in the index file.) Adopted by many non-BSD Unixes and GNU, this format is called "SVR4/GNU" by BSD documentations.[14]
The index file is named "//". CityPopulation.de. Citing: {{{3}}}.
and is usually the second entry of the archive, after the symbol table which always is the first. The format of this//file itself is simply a list of the long file names, separated by the sequence/\nLF (0x2F 0x10).[14]
The SVR4/GNU format uses the special file name "/" to denote that the following data entry contains a symbol lookup table, which is used in ar libraries to speed up access. This symbol table is built in three parts which are recorded together as contiguous data.
特殊ファイル「/」は特定のシーケンスで終了しません。最後のシンボル名が読み込まれた時点で終了したとみなされ、これは文字列数またはar_sizeファイルサイズエントリから確認できます。
32ビット整数の使用によって生じる4 GiBのテーブルサイズ制限を克服するために、Solaris 11.2やGNUなどの一部のオペレーティングシステムでは、バリアントルックアップテーブルを使用しています。シンボルルックアップテーブルでは、32ビット整数の代わりに64ビット整数が使用されます。このテーブルの識別子として、文字列「/」の代わりに「/SYM64/」が使用されます[ 23 ] 。
System V 派生システムの中には、上記の形式を使用しないものもあります。HP -UX 11.0 では、この情報はSOMファイル形式に基づくデータ構造に格納されます(以前の HP-UX では SVR4 形式が使用されていることが知られています)。Tru64 Unixでは、シンボル テーブルはハッシュ テーブルになっています。[ 17 ]
Windows版は SysV/GNU 版に基づいています。最初のエントリ "/" は SVR4/GNU シンボル テーブルと同じレイアウトです。2 番目のエントリは別の "/" で、拡張シンボル相互参照テーブルを格納する Microsoft 拡張機能です。これはソートされており、リトルエンディアンの整数を使用します。[ 5 ] [ 24 ] 3 番目のエントリは、SysV/GNU と同様にオプションの長い名前データ "//" です。[ 25 ]
内部のオブジェクトファイルは、通常のPE/COFFオブジェクトファイルです。ファイル拡張子は通常で.lib、これらのファイルを操作するためのツールLIB.EXEが提供されています。
GNU binutilsおよびElfutils の実装には、マジックナンバー を持つ追加の「シンアーカイブ」形式があります。シンアーカイブには、シンボルテーブルとファイルへの参照のみが含まれます。ファイル形式は基本的に System V 形式のアーカイブであり、すべてのファイルはデータセクションなしで格納されます。すべてのファイル名は「長い」ファイル名として格納され、シンボリックリンク!<thin>であるかのように解決されます。[ 26 ]
以下のコマンドは、オブジェクトファイルclass1.o、class2.o、class3.oを含むアーカイブlibclass.aを作成します。
ar rcs libclass.a class1.o class2.o class3.o
リンカはldアーカイブファイルからオブジェクトコードを読み込むことができます。次の例は、アーカイブlibclass.a(-lclassとして指定)がmain.oのオブジェクトコードとリンクされる方法を示しています。
ld main.o -lclass
long、サイズとエンディアンによって異なる場合があります。ほとんどの x86 および x86-64 システムではlong32 ビットであり、2 GiB のサイズ制限が課されます。{{cite book}}: CS1 maint: 非推奨のアーカイブサービス (リンク)コード:訂正: