ar(4) ar(4)
NAME
ar - Format der Archivdatei
SYNTAX
#include <ar.h>
BESCHREIBUNG
Das Archivkommando ar wird zum Zusammenfassen mehrerer Dateien in eine
Datei verwendet. Archive werden hauptsächlich als Bibliotheken verwen-
det, die vom Binder ld(1) durchsucht werden.
Jedes Archiv beginnt mit der magischen Archivzeichenkette.
#define ARMAG "!<arch>\n" /* magische Zeichenkette */
#define SARMAG 8 /* Länge der magischen Zeichenkette */
Nach der magischen Archivzeichenkette folgen die Archivdateielemente.
Vor jedem Dateielement steht ein Dateielement-Kopf in folgendem For-
mat:
#define ARFMAG "\n" /* Abschlußzeichenkette des Kopfes */
struct arhdr /* Dateikopf */
{
char arname[16]; /* '/' abgeschlossener Dateiname */
char ardate[12]; /* Datum der Datei */
char aruid[6]; /* Dateibenutzernummer */
char argid[6]; /* Dateigruppennumer */
char armode[8]; /* Dateimodus (oktal) */
char arsize[10]; /* Dateigröße */
char arfmag[2]; /* Abschlußzeichenkette des Kopfes */
};
Alle Daten in den Dateiköpfen sind abdruckbarer ASCII-Code. Die nume-
rischen Informationen in den Köpfen werden als Dezimalzahlen gespei-
chert (mit Ausnahme von armode, der in Oktaldarstellung angegeben
wird). Wenn das Archiv abdruckbare Dateien enthält, ist es selbst auch
abdruckbar.
Wenn der Dateiname paßt, enthält das Feld arname den Namen direkt,
wird durch einen Schrägstrich (/) beendet und rechts mit Leerstellen
aufgefüllt. Wenn der Name nicht paßt, enthält arname einen Schräg-
strich (/), gefolgt von der dezimalen Darstellung des Relativzeigers
des Namens in der unten beschriebenen Zeichenkettentabelle des Archi-
ves.
Das Feld ardate ist das Änderungsdatum der Datei zum Zeitpunkt der
Eintragung in das Archiv. Archive in diesem Format können von einem
System zum anderen übertragen werden, solange das portierbare Archiv-
kommando ar verwendet wird.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
ar(4) ar(4)
Jedes Archivdateielement beginnt an einer geraden Byte-Grenze; falls
nötig, wird ein Neue-Zeile-Zeichen (new line) zwischen den Dateien
eingefügt. Die angegebene Größe gibt die tatsächliche Größe der Datei
ohne Füllzeichen an.
Es ist zu beachten, daß in einer Archivdatei keine Möglichkeit für
leere Bereiche gegeben ist.
Jedes Archiv, das Objektdateien enthält [siehe a.out(4)], enthält eine
Archivsymboltabelle. Diese Symboltabelle wird vom Binder ld verwendet,
um zu bestimmen, welche Teile des Archivs während des Bindens geladen
werden müssen. Die Archivsymboltabelle, sofern vorhanden, ist immer
die erste Datei im Archiv (wird aber nie aufgelistet) und wird automa-
tisch von ar erzeugt und/oder aktualisiert.
Die Archivsymboltabelle hat einen Namen der Länge 0 (d. h. arname[0]
ist '/'), arname[1]==' ', usw.). Alle "Wörter" in dieser Symbolta-
belle haben vier Bytes und verwenden die unten gezeigte, rechnerunab-
hängige Codierung. Alle Rechner verwenden die hier beschriebene Codie-
rung für die Symboltabelle, selbst wenn die "natürliche" Bytefolge
anders ist.
________________________________________________
|0 |1 |2 |3 |
| | | | |
0x01020304 | 01 | 02 | 03 | 04 |
| | | | |
|__________|___________|___________|___________|
Der Inhalt dieser Datei ist folgendermaßen:
1. die Anzahl der Symbole; Länge: 4 Bytes
2. das Feld der Relativzeiger in die Archivdatei; Länge: 4 Bytes *
"Anzahl der Symbole"
3. die Namenstabelle; Länge: arsize - 4 Bytes * ("Anzahl der Symbole"
+ 1)
Als Beispiel definiert die folgende Symboltabelle vier Symbole. Das
Archivmitglied beim Datei-Offset 114 definiert name und object. Das
Archivmitglied beim Offset 426 definiert function und eine zweite Ver-
sion von name.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
ar(4) ar(4)
Offset +0 +1 +2 +3
_________________________________
0 | 4 | 4 Offset-Einträge
|_______________________________|
4 | 114 | name
|_______________________________|
8 | 114 | object
|_______________________________|
12 | 426 | function
|_______________________________|
16 | 426 | name
|_______________________________|
20 | n | a | m | e |
|_______|_______|_______|_______|
24 | \0 | o | b | j |
|_______|_______|_______|_______|
28 | e | c | t | \0 |
|_______|_______|_______|_______|
32 | f | u | n | c |
|_______|_______|_______|_______|
36 | t | i | o | n |
|_______|_______|_______|_______|
40 | \0 | n | a | m |
|_______|_______|_______|_______|
44 | e | \0 | | |
|_______|_______|_______|_______|
Die Anzahl der Symbole und das Feld der Relativzeiger werden mit
sgetl() und sputl() verwaltet. Die Namenstabelle enthält genau soviele
mit Null-Byte endende Zeichenketten, wie Elemente im Relativzeigerfeld
vorhanden sind. Jeder Relativzeiger entspricht einem Namen in der
Namenstabelle (in derselben Reihenfolge). Die Bezeichnungen in der
Namenstabelle sind alle die definierten globalen Symbole, die in den
Objektdateien im Archiv zu finden sind. Jeder Relativzeiger ist die
Adresse des Archivkopfes für das zugehörige Symbol.
Wenn der Name eines Archivmitglieds länger als 15 Bytes ist, enthält
ein besonderes Archivmitglied eine Tabelle von Dateinamen, denen
jeweils ein Schrägstrich und eine Neue-Zeile-Zeichen folgt. Das Mit-
glied der Namenstabelle (Zeichenkettentabelle), sofern vorhanden,
steht vor allen "normalen" Archivmitgliedern. Die besondere Archivsym-
boltabelle ist kein "normales" Mitglied und muß ganz vorne stehen,
wenn sie existiert. Der Eintrag arname des Kopfes der Zeichenketten-
tabelle enthält einen Namen der Länge Null arname[0]=='/', gefolgt
von einem abschließenden Schrägstrich (arname[1]=='/'), gefolgt von
Leerzeichen (arname[2]==' ', usw.). Offsets in die Zeichenkettenta-
belle beginnen bei Null. Beispiele für arname-Werte für kurze und
lange Dateinamen finden sie unten.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
ar(4) ar(4)
Offset +0 +1 +2 +3 +4 +5 +6 +7 +8 +9
______________________________________________________________
0 | f | i | l | e | _ | n | a | m | e | _ |
|_____|______|_____|_____|_____|_____|_____|_____|_____|_____|
10 | s | a | m | p | l | e | / | \n | l | o |
|_____|______|_____|_____|_____|_____|_____|_____|_____|_____|
20 | n | g | e | r | f | i | l | e | n | a |
|_____|______|_____|_____|_____|_____|_____|_____|_____|_____|
30 | m | e | x | a | m | p | l | e | / | \n |
|_____|______|_____|_____|_____|_____|_____|_____|_____|_____|
______________________________________________________________________
| Name | ar_name | Bemerkung |
|______________________|_____________|________________________________|
| short-name | short-name | Nicht in der Zeichenkettenta- |
| | | belle |
|______________________|_____________|________________________________|
| filenamesample | /0 | Offset 0 in der Zeichenketten-|
| | | tabelle |
|______________________|_____________|________________________________|
| longerfilenamexample | /18 | Offset 18 in der Zeichenket- |
| | | tentabelle |
|______________________|_____________|________________________________|
HINWEISE
strip() entfernt alle Symboltabellen-Einträge des Archivs. Die
Symboltabellen-Einträge müssen dann wieder über die Option -ts des
Kommandos ar hergestellt werden, bevor das Archiv von dem Binder ld
verwendet werden kann.
SIEHE AUCH
ar(1), ld(1), strip(1), sputl(3X), a.out(4).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98