Ar (Unix)

ar
Originalautor (en) Ken Thompson,
Dennis Ritchie
(AT & T Bell Laboratories)
Entwickler (en) Verschiedene Open Source und kommerziell Entwickler
Erstveröffentlichung 3. November 1971; vor 50 Jahren
Geschrieben in C
Betriebssystem Unix, Unix-artig, V, Plan 9, Inferno
Plattform Plattformübergreifend
Typ Befehl
Lizenz Plan 9: MIT -Lizenz
Archivernformat
Dateiname Erweiterung
.a, .lib, .ar[1]
Internet -Medientyp
Anwendung/X-Archive[1]
magische Zahl ! <arch>
Art des Formats Archivformat
Container für normalerweise Objektdateien ( , .OBJ)
Standard Nicht standardisiert, es existieren mehrere Varianten
Offenes Format? Ja[2]

Das Archiverauch einfach als einfach als als ar, ist ein Unix Dienstprogramm, das Gruppen von Dateien als einzeln verwaltet Archivdatei. Heute, ar wird im Allgemeinen nur zum Erstellen und Aktualisieren verwendet Statische Bibliothek Dateien, die der Link -Editor oder Linker Verwendet und zum Generieren von .deb -Paketen für die Debian Familie; Es kann verwendet werden, um Archive für jeden Zweck zu erstellen, wurde jedoch weitgehend durch ersetzt durch Teer Für andere Zwecke als statische Bibliotheken.[3] Eine Implementierung von ar ist als einer der der Gnu binutils.[2]

In dem Linux Standard Base (LSB), ar wurde veraltet und wird voraussichtlich in einer zukünftigen Veröffentlichung dieses Standards verschwinden. Die Begründung stellte fest, dass "der LSB keine Softwareentwicklungsversorgungsunternehmen enthält, noch.[4]

Dateiformatdetails

Diagramm, das eine Beispiel -Dateistruktur einer .deb -Datei zeigt

Das AR -Format wurde nie standardisiert; Moderne Archive basieren auf einem gemeinsamen Format mit zwei Hauptvarianten, BSD und System v (ursprünglich bekannt als Sargund auch benutzt von GNU, ELF, und Fenster.))

Historisch gesehen gab es andere Varianten[5] einschließlich V6, V7, AIX (klein und groß) und kohärent, die alle erheblich vom gemeinsamen Format unterscheiden.[6]

Debian ".Deb"Archive verwenden das gemeinsame Format.

Eine AR -Datei beginnt mit einem globalen Header, gefolgt von einem Header- und Datenabschnitt für jede in der AR -Datei gespeicherte Datei.

Jeder Datenabschnitt ist 2 Byte ausgerichtet. Wenn es mit einem seltsamen Offset enden würde, wird eine neue Linie ('\ n', 0x0a) als Füllstoff verwendet.

Datei Signatur

Die Dateisignatur ist ein einzelnes Feld, das das enthält Magische ASCII -Schnur "!" gefolgt von einer einzigen Lf Kontrollzeichen (0x0a).

Dateiheader

Jede in einem AR -Archiv gespeicherte Datei enthält einen Datei -Header, um Informationen über die Datei zu speichern. Das gemeinsame Format ist wie folgt. Numerische Werte werden in ASCII und allen Werten mit ASCII-Leerzeichen (0x20) codiert.

Offset Länge Name Format
0 16 Dateikennung ASCII
16 12 Dateimodifikation Zeitstempel (in Sekunden) Dezimal
28 6 Eigentümer id Dezimal
34 6 Gruppen-ID Dezimal
40 8 Dateimodus (Typ und Erlaubnis) Oktal
48 10 Dateigröße in Bytes Dezimal
58 2 Beendigung von Charakteren 0x60 0x0a

Da die Header nur druckbare ASCII -Zeichen und Zeilenfutter enthalten, scheint ein Archiv, das nur Textdateien enthält, immer noch eine Textdatei selbst zu sein.

Die Mitglieder sind auf sogar Byte -Grenzen ausgerichtet. "Jedes Archivdateielement beginnt an einer gleichmäßigen Bytegrenze. Bei Bedarf wird zwischen den Dateien zwischen den Dateien eingefügt. Die angegebene Größe spiegelt jedoch die tatsächliche Größe der Datei ausschließlich der Polsterung wider."[7]

Aufgrund der Einschränkungen der Dateinamenlänge und des Formats entwickelten sowohl die GNU- als auch die BSD -Varianten verschiedene Methoden zum Speichern von langen Dateinamen. Obwohl das gemeinsame Format nicht unter dem leidet Jahr 2038 ProblemViele Implementierungen des AR -Dienstprogramms dienen und müssen möglicherweise in Zukunft geändert werden, um die richtigen Zeitstempel von mehr als 2147483647 zu verarbeiten. Eine Beschreibung dieser Erweiterungen findet sich in libbfd.[8]

Abhängig vom Format enthalten viele AR -Implementierungen eine globale Symboltabelle (auch bekannt als Armap, Verzeichnis oder Index) zum schnellen Verknüpfen, ohne das gesamte Archiv nach einem Symbol zu scannen. POSIX erkennt diese Funktion und erfordert AR -Implementierungen, um eine zu haben -s Option zum Aktualisieren. Die meisten Implementierungen setzen es beim ersten Dateieintrag ein.[9]

BSD -Variante

BSD AR speichert Dateinamen mit ASCII-Räumen rechts. Dies verursacht Probleme mit Leerzeichen innerhalb von Dateinamen.4.4bs AR speichert erweiterte Dateinamen, indem die Zeichenfolge "#1/" gefolgt von der Dateinamenlänge im Feld Dateinamen platziert und den realen Dateinamen vor dem Datenabschnitt gespeichert wird.[6]

BSD AR -Dienstprogramm überträgt traditionell nicht die Erstellung einer globalen Symbol -Nachschlagtabelle und delegiert diese Aufgabe an ein separates Dienstprogramm namens namens Ranlib,[10] das fügt eine architekturspezifische Datei mit dem Namen __. Symdef Als erstes Archivmitglied.[11] Einige Nachkommen haben nach dem Namen einen Platz eingelegt und "sortiert", um eine sortierte Version anzuzeigen.[12] Eine 64-Bit-Variante genannt __.SYMDEF_64 existiert auf Darwin.

Da posix die Anforderung für die hinzugefügt hat -s Option als Ersatz von RANLIB, wurden jedoch neuere BSD -AR -Implementierungen um diese Funktion umgeschrieben. Insbesondere FreeBSD hat das Symdef -Tabellenformat geworfen und die System -V -Style -Tabelle angenommen.[13]

System V (oder GNU) Variante

System V AR verwendet ein '/' Zeichen (0x2f), um das Ende des Dateinamens zu markieren. Dies ermöglicht die Verwendung von Leerzeichen ohne die Verwendung eines erweiterten Dateinamens. Anschließend werden mehrere erweiterte Dateinamen im Datenabschnitt einer Datei mit dem Namen "//" gespeichert. Dieser Datensatz wird von zukünftigen Headern bezeichnet. Ein Header bezieht sich auf einen erweiterten Dateinamen, indem ein "/" gefolgt von einem Dezimalversatz zum Beginn des Dateinnamens im Abschnitt erweiterter Dateiname -Daten ausgeführt wird. Das Format dieser "//" -Datei selbst ist einfach eine Liste der langen Dateinamen, die jeweils durch ein oder mehrere LF -Zeichen getrennt sind. Beachten Sie, dass die Dezimalausfälle die Anzahl der Zeichen, keine Zeilen- oder Zeichenfolgennummer in der Datei "//" sind. Dies ist normalerweise der zweite Eintrag der Datei nach der Symboltabelle, die immer die erste ist.

System V AR verwendet den speziellen Dateinamen "/", um zu bezeichnen, dass die folgende Dateneingabe eine Symbol -Lookup -Tabelle enthält, die in AR -Bibliotheken verwendet wird, um den Zugriff zu beschleunigen. Diese Symboltabelle ist in drei Teilen aufgebaut, die als zusammenhängende Daten zusammen aufgezeichnet werden.

  1. Eine 32-Bit-Bigendian-Ganzzahl, die die Anzahl der Einträge in der Tabelle gibt.
  2. Ein Satz von 32-Bit-Bigendian-Ganzzahlen. Eine für jedes Symbol, die die Position im Archiv des Headers für die Datei mit diesem Symbol aufzeichnet.
  3. Ein Satz von nullterminierten Zeichenfolgen. Jeder ist ein Symbolname und tritt in derselben Reihenfolge wie die Liste der Positionen in Teil 2 auf.

Einige System -V -Systeme verwenden das oben beschriebene Format nicht für die Symbol -Lookup -Tabelle. Für Betriebssysteme wie z. HP-UX 11.0, diese Informationen werden in einer Datenstruktur basierend auf dem gespeichert SO M Datei Format.

Die Sonderdatei "/" wird nicht mit einer bestimmten Sequenz beendet; Das Ende wird angenommen, sobald der letzte Symbolname gelesen wurde.

Um die 4 GIB -Dateigröße zu überwinden, beschränken Sie ein Betriebssystem wie Solaris 11.2 und GNU verwenden eine Variante -Lookup -Tabelle. Anstelle von 32-Bit-Ganzzahlen werden 64-Bit-Ganzzahlen in den Symbol-Lookup-Tischen verwendet. Die Zeichenfolge "/sym64/" stattdessen "/" wird als Kennung für diese Tabelle verwendet[14]

Windows -Variante

Die Windows -Variante (PE/Coff) basiert auf der SYSV/GNU -Variante. Der erste Eintrag "/" hat das gleiche Layout wie die SYSV/GNU -Symboltabelle. Der zweite Eintrag ist ein weiterer "/", ein Microsoft ECOFF Erweiterung, die ein erweitertes Symbol-Kreuzverweis-Tabelle speichert. Dieser ist sortiert und verwendet Little-Endian-Ganzzahlen.[5][15] Der dritte Eintrag ist die optionalen "//" -Namendaten wie in sysv/gnu.[16]

Dünnes Archiv

Die Version von ar in Gnu binutils und Elfutils Haben Sie ein zusätzliches "dünnes Archiv" -Format mit der magischen Zahl ! <Din>. Ein dünnes Archiv enthält nur eine Symboltabelle und Verweise auf die Datei. Das Dateiformat ist im Wesentlichen ein System -V -Formatarchiv, in dem jede Datei ohne die Datenabschnitte gespeichert wird. Jeder Dateiname wird als "langer" Dateiname gespeichert und sie sollen gelöst werden, als ob sie es wären Symbolische Links.[17]

Beispiel Verwendung

So erstellen Sie ein Archiv aus Dateien class1.o, class2.o, class3.oDer folgende Befehl würde verwendet:

AR RCS libclass.a class1.o class2.o class3.o

UNIX -Linker, normalerweise durch die aufgerufen C Compiler CC, kann lesen ar Dateien und extrahieren Objektdateien von ihnen, also wenn libclass.a ist ein Archiv mit class1.o, class2.o und class3.o, dann

CC Main.C libClass.A

oder (wenn libClass.a in Standardbibliotheksweg platziert wird, wie /usr/local/lib))

CC Main.c -Lasse

oder (während der Verknüpfung)

ld ... main.o -lclass ...

ist das gleiche wie:

CC main.c class1.o class2.o class3.o

Siehe auch

Verweise

  1. ^ a b "Anwendung/X-Archive". Abgerufen 2019-03-11.
  2. ^ a b "AR (1) - Linux Man Page". Abgerufen 3. Oktober 2013.
  3. ^ "Statische Bibliotheken". TLDP. Abgerufen 3. Oktober 2013.
  4. ^ Linux Standard Basis -Kernspezifikation, Version 4.1, Kapitel 15. Befehle und Dienstprogramme> ar
  5. ^ a b Levine, John R. (2000) [Oktober 1999]. "Kapitel 6: Bibliotheken". Linker und Lader. Die Morgan Kaufmann -Serie in Software Engineering and Programming (1 Ed.). San Francisco, USA: Morgan Kaufmann. ISBN 1-55860-496-0. OCLC 42413382. Archiviert vom Original am 2012-12-05. Abgerufen 2020-01-12. Code: [1][2] Errata: [3]
  6. ^ a b Manuelle Seite für das NET/2 AR -Dateiformat
  7. ^ "ar.h". www.unix.com. Die Unix- und Linux -Foren.
  8. ^ "Bminor/Binutils-Gdb: archive.c". GitHub. 16. Juli 2022.
  9. ^ ar- Shell and Utilities Referenz, Die einzelne Unix -Spezifikation, Version 4 von Die offene Gruppe
  10. ^ Manuelle Seite für NET/2 RANLIB -Dienstprogramm
  11. ^ Manuelle Seite für NET/2 RANLIB -Dateiformat
  12. ^ "ranlib.h". openSource.apple.com.
  13. ^ AR (5)- -Freebsd Dateiformate Handbuch
  14. ^ "ar.h (3head)". docs.oracle.com. Oracle Corporation. 11. November 2014. Abgerufen 14. November 2018.
  15. ^ Pietrek, Matt (April 1998), "Unter der Haube", Microsoft Systems Journal, archiviert von das Original am 2007-06-24, abgerufen 2014-08-23
  16. ^ "LLVM-Mirror/LLVM: archive.cpp (Formaterkennung)". GitHub. Abgerufen 10. Februar 2020.
  17. ^ "ar". Binärversorger GNU.

Externe Links