ar (Unix)

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search

Developer(s)AT&T Bell Laboratories
Initial releaseNovember 3, 1971; 48 years ago (1971-11-03)
Operating systemUnix and Unix-like
archiver format
Filename extension.a, .lib, .ar[1]
Internet media typeapplication/x-archive[1]
Magic number!<arch>
Type of formatarchive format
Container for.o, .obj
StandardNot standardized, several variants exist
Open format?Yes[2]

The archiver, also known simply as ar, is a Unix utility that maintains groups of files as a single archive file. Today, ar is generally used only to create and update static library files that the link editor or linker uses and for generating .deb packages for the Debian family; it can be used to create archives for any purpose, but has been largely replaced by tar for purposes other than static libraries.[3] An implementation of ar is included as one of the GNU Binutils.[2]

In the Linux Standard Base (LSB), ar has been deprecated and is expected to disappear in a future release of that Standard. The rationale provided was that "the LSB does not include software development utilities nor does it specify .o and .a file formats."[4]

File format details[edit]

Diagram showing an example file structure of a .deb file

The ar format has never been standardized; modern archives are based on a common format with two main variants, BSD and System V (initially known as COFF, and used as well by GNU, ELF, and Windows.)

Historically there have been other variants[5] including V6, V7, AIX (small and big), and Coherent, which all vary significantly from the common format.[6]

Debian ".deb" archives use the common format.

An ar file begins with a global header, followed by a header and data section for each file stored within the ar file.

Each data section is 2 byte aligned. If it would end on an odd offset, a newline ('\n', 0x0A) is used as filler.

File signature[edit]

The file signature is a single field containing the magic ASCII string "!<arch>" followed by a single LF control character (0x0A).

File header[edit]

Each file stored in an ar archive includes a file header to store information about the file. The common format is as follows. Numeric values are encoded in ASCII and all values right-padded with ASCII spaces (0x20).

Offset Length Name Format
0 16 File identifier ASCII
16 12 File modification timestamp Decimal
28 6 Owner ID Decimal
34 6 Group ID Decimal
40 8 File mode Octal
48 10 File size in bytes Decimal
58 2 Ending characters 0x60 0x0A

As the headers only include printable ASCII characters and line feeds, an archive containing only text files therefore still appears to be a text file itself.

The members are aligned to even byte boundaries. "Each archive file member begins on an even byte boundary; a newline is inserted between files if necessary. Nevertheless, the size given reflects the actual size of the file exclusive of padding."[7]

Due to the limitations of file name length and format, both the GNU and BSD variants devised different methods of storing long filenames. Although the common format does not suffer from the year 2038 problem, many implementations of the ar utility do and may need to be modified in the future to handle correctly timestamps in excess of 2147483647.

BSD variant[edit]

BSD ar stores filenames right-padded with ASCII spaces. This causes issues with spaces inside filenames. 4.4BSD ar stores extended filenames by placing the string "#1/" followed by the file name length in the file name field, and storing the real filename in front of the data section.[6]

BSD ar utility traditionally does not handle the building of a global symbol lookup table, and delegates this task to a separate utility named ranlib,[8] which inserts an architecture-specific file named __.SYMDEF as first archive member.[9]

System V (or GNU) variant[edit]

System V ar uses a '/' character (0x2F) to mark the end of the filename; this allows for the use of spaces without the use of an extended filename. Then it stores multiple extended filenames in the data section of a file with the name "//", this record is referred to by future headers. A header references an extended filename by storing a "/" followed by a decimal offset to the start of the filename in the extended filename data section. The format of this "//" file itself is simply a list of the long filenames, each separated by one or more LF characters. Note that the decimal offsets are number of characters, not line or string number within the "//" file.

System V ar uses the special filename "/" 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.

  1. A 32-bit big endian integer, giving the number of entries in the table.
  2. A set of 32-bit big endian integers. One for each symbol, recording the position within the archive of the header for the file containing this symbol.
  3. A set of Zero-terminated strings. Each is a symbol name, and occurs in the same order as the list of positions in part 2.

Some System V systems do not use the format described above for the symbol lookup table. For operating systems such as HP-UX 11.0, this information is stored in a data structure based on the SOM file format.

The special file "/" is not terminated with a specific sequence; the end is assumed once the last symbol name has been read.

The Windows variation adds a second special "/" which stores an extended symbol cross-reference table,[5] stored sorted and using little-endian integers.[10]

64-bit variant[edit]

To overcome the 4 GiB file size limit some operating system like Solaris 11.2 use a variant.[11] Instead of 32-bit integers, 64-bit integers are used in the symbol lookup tables. Furthermore here the string "/SYM64/" instead "/" is used as identifier for this table.

Example usage[edit]

To create an archive from files class1.o, class2.o, class3.o, the following command would be used:

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

Unix linkers, usually invoked through the C compiler cc, can read ar files and extract object files from them, so if libclass.a is an archive containing class1.o, class2.o and class3.o, then

cc main.c libclass.a

or (if libclass.a is placed in standard library path, like /usr/local/lib)

cc main.c -lclass

or (during linking)

ld ... main.o -lclass ...

is the same as:

cc main.c class1.o class2.o class3.o

See also[edit]


  1. ^ a b "application/x-archive". Retrieved 2019-03-11.
  2. ^ a b "ar(1) - Linux man page". Retrieved 3 October 2013.
  3. ^ "Static Libraries". TLDP. Retrieved 3 October 2013.
  4. ^ Linux Standard Base Core Specification, version 4.1, Chapter 15. Commands and Utilities > ar
  5. ^ a b John R. Levine (1999). Linkers and Loaders. Morgan Kaufmann., chapter 6: Libraries[permanent dead link]
  6. ^ a b Manual page for NET/2 ar file format
  7. ^ "ar.h". The UNIX and Linux Forums.
  8. ^ Manual page for NET/2 ranlib utility
  9. ^ Manual page for NET/2 ranlib file format
  10. ^ Pietrek, Matt (April 1998), "Under The Hood", Microsoft Systems Journal, retrieved 2014-08-23
  11. ^ "ar.h(3HEAD)". Oracle Corporation. 11 November 2014. Retrieved 14 November 2018.

External links[edit]