ar-Dateiformat (klein)

Zweck

Beschreibt das kleine indexierte Archivdateiformat, das vor Version 4.3 des Betriebssystems verwendet wurde. Dieses Format wird nur aus Gründen der Abwärtskompatibilität von Befehlen erkannt. Das aktuelle Archivdateiformat finden Sie in ar-Dateiformat (Big) .

Beschreibung

Der Befehl 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 Archivformat verarbeitet nur 32-Bit-XCOFF-Member. ar-Dateiformat (Big) verarbeitet sowohl 32 -Bit-als auch 64-Bit-XCOFF-Member

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 AIAMAG "<aiaff>\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[12];      /* Offset to member table */
char fl_gstoff[12];      /* Offset to global symbol table */
char fl_fstmoff[12];     /* Offset to first archive member */
char fl_lstmoff[12];     /* Offset to last archive member */
char fl_freeoff[12];     /* 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[12];       /* File member size - decimal */
        char ar_nxtmem[12];     /* Next member offset - decimal*/
        char ar_prvmem[12];     /* Previous member offset - dec */
        char ar_date[12];       /* File member date - decimal */
        char ar_uid[12];        /* File member user id - 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 12 Byte lang und wird im ASCII-Format als Dezimalzahl gespeichert.
  • Das Array der Offsets in die Archivdatei Die Länge beträgt 12 Mal die Anzahl der Mitglieder. Jeder Offset ist 12 Byte lang und wird im ASCII-Format als Dezimalzahl gespeichert.
  • Die Namenszeichenfolgetabelle. Die Größe ist:
    ar_size - (12 * (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 Symboltabelle

Wenn eine Archivdatei XCOFF-Objektteildateien enthält, die nicht entfernt werden, enthält die Archivdatei eine globale Symboltabellenteildatei. Diese globale Symboltabelle lokalisiert Teildateien, die globale Symbole definieren. Der Befehl Streifen löscht die globale Symboltabelle aus dem Archiv. Derfl_gstoffFeld im Header mit fester Länge enthält den Offset zur globalen Symboltabelle. Das globale Symboltabellenmember hat einen Namen mit Nulllänge. Der Befehl Ar erstellt und aktualisiert automatisch, listet jedoch die globale Symboltabelle nicht auf. Eine globale Symboltabelle enthält die folgenden Informationen:

  • Die Anzahl der Symbole Dieser Wert ist 4 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 Vierfache der Anzahl der Symbole. Jeder Offset ist 4 Byte lang und kann mit den Befehlen Sgetl und Sputl aufgerufen werden.
  • Die Namenszeichenfolgetabelle. Die Größe ist:
    ar_size - (4 * (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.