AR(4) SysV AR(4)
NAME
ar - common archive file format
SYNOPSIS
#include <ar.h>
DESCRIPTION
The archive command ar(1) is used to combine several files into one.
Archives are used mainly as libraries to be searched by the link editor
ld(1).
Each archive begins with the archive magic string.
#define ARMAG "!<arch>\n" /* magic string */
#define SARMAG 8 /* length of magic string */
Each archive which contains common object files [see a.out(4)] includes
an archive symbol table. This symbol table is used by the link editor
ld(1) to determine which archive members must be loaded during the link
edit process. The archive symbol table (if it exists) is always the
first file in the archive (but is never listed) and is automatically
created and/or updated by ar.
Following the archive magic string are the archive file members. Each
file member is preceded by a file member header which is of the following
format:
#define ARFMAG "`\n" /* header trailer string */
struct ar_hdr /* file member header */
{
char ar_name[16]; /* '/' terminated file member name */
char ar_date[12]; /* file member date */
char ar_uid[6]; /* file member user identification */
char ar_gid[6]; /* file member group identification */
char ar_mode[8]; /* file member mode (octal) */
char ar_size[10]; /* file member size */
char ar_fmag[2]; /* header trailer string */
};
All information in the file member headers is in printable ASCII. The
numeric information contained in the headers is stored as decimal numbers
(except for ar_mode which is in octal). Thus, if the archive contains
printable files, the archive itself is printable.
The ar_name field is blank-padded and slash (/) terminated. If the name
of the member is longer than 15 characters, the truncated name is in the
ar_name field. The ar_date field is the modification date of the file at
the time of its insertion into the archive. Common format archives can
be moved from system to system as long as the portable archive command
ar(1) is used. Conversion tools such as convert(1) exist to aid in the
transportation of non-common format archives to this format.
In addition to handling file members with longer than 15 character file
names, archives created on Apollo systems support Apollo module names (if
the archive contains common object files). Special file members, similar
to the archive symbol table, are used for this system-specific support.
These special files are never listed and are automatically created and/or
updated by ar and understood by ld(1). See "Warnings" for more
discussion on compatibility issues.
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.
Notice there is no provision for empty areas in an archive file.
The archive symbol table, Apollo module table and long filename table are
always the first three files in the archive. The names of the files and
the order in which they appear in the archive are as follows:
/ archive symbol table (if exists)
.__APMODNAMES/ Apollo module table (if exists)
.__APLGNAMES/ long filename table
If the archive symbol table exists, the first file in the archive has a
zero length name (that is, ar_name[0] == '/' ). The contents of this
file are as follows:
⊕ The number of symbols. Length: 4 bytes.
⊕ The array of offsets into the archive file. Length: 4 bytes * "the
number of symbols".
⊕ The name string table. Length: ar_size - (4 bytes * ("the number of
symbols" + 1)).
The number of symbols and the array of offsets are managed with sgetl and
sputl. The string table contains exactly as many null terminated strings
as there are elements in the offsets array. Each offset from the array
is associated with the corresponding name from the string table (in
order). The names in the string table are all the defined global symbols
found in the common object files in the archive. Each offset is the
location of the archive header for the associated symbol.
The Apollo module table exists if the archive contains common object
files. The contents of this file have the following format:
struct ar_names_hdr {
long ar_n_names; /* number of modules */
long ar_strtabsz; /* size of string table */
};
struct ar_modname {
long ar_file_ptr; /* offset fd into ar */
long ar_n_offset; /* offset into string table */
unsigned long ar_mod_attr; /* module attributes */
};
⊕ The number of modules. Length: 4 bytes.
⊕ The size of the string table. Length: 4 bytes.
⊕ One structure for each module. The first 4 bytes contain the location
of the archive header for the file, the second 4 bytes are the offset
into the string table for the module name, and the final 4 bytes
contain the module attributes. Length: 12 bytes * "number of
modules"
⊕ The module string table. Length: size given above.
The module string table contains null terminated strings for the module
names of each archive member that is a common object file.
The long filename table allows Apollo archives to support files with
names that are longer than 15 characters. The contents of the long
filename table have the following format:
struct ar_names_hdr {
long ar_n_names; /* number of modules */
long ar_strtabsz; /* size of string table */
};
struct ar_name {
long ar_file_ptr; /* offset fd into ar */
long ar_n_offset; /* offset into string table */
};
⊕ The number of filenames. Length: 4 bytes.
⊕ The size of the string table. Length: 4 bytes.
⊕ Pairs of offsets, one for each file in archive. The first offset is
the location of the archive header for the file, the second offset is
the offset into the string table. Length: 8 bytes * "number of
filenames".
⊕ The file string table. Length: size given above.
The string table contains null terminated strings for the names of each
archive member. Each archive member (except the special files used by
ar(1)) has an entry in the filename table, regardless of the actual
length of the name.
SEE ALSO
ar(1), ld(1), strip(1), sputl(3X), a.out(4).
WARNINGS
strip(1) will remove all archive symbol entries from the header. The
archive symbol entries must be restored via the ts option of the ar(1)
command before the archive can be used with the link editor ld(1). The
ts option of ar(1) also restores the module name table.
Archives built on other systems and brought to Apollo systems may not
have the special Apollo files and consequently may not support long file
names. Archives built on Apollo systems and brought to other systems
will be readable by ar(1), but it is likely that ar(1) on foreign systems
will not handle the Apollo special files. This means that long filename
information will be lost and possibly corrupted if the archive is
modified on the foreign system and subsequently brought back to an Apollo
system.