ar-Dateiformat (Big)

Zweck

Kombiniert mehrere Dateien zu einer Datei. Dies ist das Standardarchivformat der Ar -Bibliothek für das Betriebssystem.

Beschreibung

Das Dateiformat Ar (Archiv) kombiniert mehrere Dateien in einem. Der Befehl Ar erstellt eine Archivdatei. Der Befehl Ld (Linkeditor) durchsucht Archivdateien, um Programmverbindungen aufzulösen. Die Datei /usr/include/ar.h beschreibt das Archivdateiformat. Dieses Dateiformat unterstützt sowohl 32 -Bit-als auch 64-Bit-Objektdateien innerhalb desselben Archivs.

Dies ist das Standarddateiformat, das vom Befehl Ar verwendet wird.

Header mit fester Länge

Jedes Archiv beginnt mit einem Header fester Länge, der Offsets für spezielle Archivteildateien enthält. Der Header mit fester Länge enthält auch den Dateitypanzeiger, der die Archivdatei identifiziert. Der Header mit fester Länge hat das folgende Format:

#define __AR_BIG__
#define AIAMAGBIG "<bigaf>\n"       /* Magic string */
#define SAIAMAG 8                /*Length of magic string */
struct  fl_hdr                   /*Fixed-length header */

{
char  fl_magic[SAIAMAG];  /* Archive magic string */
char  fl_memoff[20];      /*Offset to member table */
char  fl_gstoff[20];      /*Offset to global symbol table */
char  fl_gst64off[20];    /*Offset global symbol table for 64-bit objects */
char  fl_fstmoff[20];     /*Offset to first archive member */
char  fl_lstmoff[20];     /*Offset to last archive member */
char  fl_freeoff[20];     /*Offset to first mem on free list */

} ;

Das indexierte Archivdateiformat verwendet eine Liste mit doppelten Links innerhalb der Archivdatei, um die Teildateien zu sortieren. Daher können Teildateien innerhalb des Archivs nicht sequenziell sortiert werden. Die im Header mit fester Länge enthaltenen Offsets lokalisieren die ersten und letzten Teildateien des Archivs. Die Memberreihenfolge wird durch die verknüpfte Liste bestimmt.

Der Header mit fester Länge enthält auch die relativen Positionen zur Mitgliedstabelle, zur globalen Symboltabelle und zur Liste freier Elemente. Sowohl die Membertabelle als auch die globale Symboltabelle sind als Member des Archivs vorhanden und werden am Ende der Archivdatei beibehalten. Die Liste freier Seiten enthält Teildateien, die aus dem Archiv gelöscht wurden. Beim Hinzufügen neuer Teildateien zum Archiv wird freier Listenbereich verwendet, bevor die Größe der Archivdatei erweitert wird. Ein Nulloffset im Header mit fester Länge gibt an, dass das Member in der Archivdatei nicht vorhanden ist.

Kopfzeile der Teildatei

Jeder Archivteildatei ist ein Teildateikennsatz vorangestellt, der folgende Informationen über die Teildatei enthält:

#define  AIAFMAG  "`\n"          /* Header trailer string*/
struct   ar_hdr                  /* File member header*/
{
           char ar_size[20];     /* File member size - decimal */
           char ar_nxtmem[20];   /* Next member offset-decimal */
           char ar_prvmem[20];   /* Previous member offset-dec */
           char ar_date[12];     /* File member date-decimal */
           char ar_uid[12];      /* File member userid-decimal */
           char ar_gid[12];      /* File member group id-decimal */
           char ar_mode[12];     /* File member mode-octal */
           char ar_namlen[4];    /* File member name length-dec */
           union
                   {
                   char ar_name[2];  /* Start of member name */
                   char ar_fmag[2];  /* AIAFMAG - string to end */
                   };
           _ar_name;                /* Header and member name */
};

Der Member-Header unterstützt Membernamen mit einer Länge von bis zu 255 Zeichen. Derar_namlenenthält die Länge des Teildateinamens. Die Zeichenfolge, die den Teildateinamen enthält, beginnt am_ar_nameerlaubt. DerAIAFMAGZeichenfolge ist nur kosmetisch.

Jeder Header eines Archivelmembers beginnt an einer geraden Bytegrenze. Die Gesamtlänge eines Member-Headers beträgt:
sizeof (struct ar_hdr) + ar_namlen 

Die tatsächlichen Daten für eine Teildatei beginnen bei der ersten geraden Bytegrenze hinter dem Teildateiheader und werden für die Anzahl Byte fortgesetzt, die durch diear_sizeerlaubt. Der Befehl Ar fügt bei Bedarf Nullbytes zum Auffüllen ein.

Alle Informationen im Header und den Archivelemente mit fester Länge sind im druckbaren ASCII-Format. Numerische Informationen, mit Ausnahme derar_modewird als Dezimalzahl gespeichert; diear_modewird im Oktalformat gespeichert. Wenn die Archivdatei also nur druckbare Dateien enthält, können Sie das Archiv drucken.

Mitgliedertabelle

Eine Teildateitabelle ist immer in einer indexierten Archivdatei vorhanden. Diese Tabelle sucht schnell nach Mitgliedern des Archivs. Derfl_memoffFeld im Header mit fester Länge enthält den Offset zur Mitgliedstabelle. Der Member-Tabelleneintrag hat einen Namen mit der Länge null. Der Befehl Ar erstellt und aktualisiert die Membertabelle automatisch (listet sie jedoch nicht auf). Eine Mitgliedstabelle enthält die folgenden Informationen:

  • Die Anzahl der Member. Dieses Member ist 20 Byte lang und wird im ASCII-Format als Dezimalzahl gespeichert.
  • Das Array der Offsets in die Archivdatei Die Länge beträgt das 20-fache der Anzahl der Member. Jeder Offset ist 20 Byte lang und wird im ASCII-Format als Dezimalzahl gespeichert.
  • Die Namenszeichenfolgetabelle. Die Größe ist:
    ar_size - (20 * (the number of members +1)); 

    Das heißt, die Größe entspricht der Gesamtlänge aller Member minus der Länge der Offsets minus der Länge der Anzahl der Member.

    Die Zeichenfolgetabelle enthält dieselbe Anzahl von Zeichenfolgen wie Offsets. Alle Zeichenfolgen sind auf null endend. Jeder Offset vom Array entspricht sequenziell einem Namen in der Zeichenfolgetabelle.

Globale Symboltabellen

Unmittelbar nach der Membertabelle enthält die Archivdatei zwei globale Symboltabellen. Die erste globale Symboltabelle sucht 32-Bit-Teildateien, die globale Symbole definieren. Die zweite globale Symboltabelle ist für 64-Bit-Teildateien identisch. Enthält das Archiv keine 32 -Bit-oder 64-Bit-Teildateien, wird die entsprechende globale Symboltabelle übergangen. Mit dem Befehl Streifen können Sie eine oder beide globale Symboltabellen aus dem Archiv löschen. Derfl_gstoffFeld im Header mit fester Länge enthält den Offset zur globalen 32-Bit-Symboltabelle und diefl_gst64offenthält den Offset zur globalen 64-Bit-Symboltabelle. Die globalen Symboltabellenmember haben Namen mit der Länge null. Der Befehl Ar erstellt und aktualisiert automatisch, listet jedoch nicht die globalen Symboltabellen auf. Eine globale Symboltabelle enthält die folgenden Informationen:

  • Die Anzahl der Symbole Dieser Wert ist 8 Byte lang und kann mit den Befehlen Sgetl und Sputl aufgerufen werden.
  • Das Array der Offsets in die Archivdatei Die Länge beträgt das achtfache der Anzahl der Symbole. Jeder Offset ist 8 Byte lang und kann mit den Befehlen Sgetl und Sputl aufgerufen werden.
  • Die Namenszeichenfolgetabelle. Die Größe ist:
    ar_size - (8  *  (the number of symbols + 1));
    Das heißt, die Größe entspricht der Gesamtlänge der Mitglieder minus der Länge der Offsets minus der Länge der Anzahl der Symbole.

    Die Zeichenfolgetabelle enthält dieselbe Anzahl von Zeichenfolgen wie Offsets. Alle Zeichenfolgen sind auf null endend. Jeder Offset vom Array entspricht sequenziell einem Namen in der Zeichenfolgetabelle.