Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ ar(4) — sys5 — Apollo Domain/OS SR10.4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

ar(1)

ld(1)

strip(1)

sputl(3X)

a.out(4)

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.

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026