ar (archiver) aus den GNU Binutils erzeugt und verwaltet Archive — Dateien, die mehrere Objektdateien bündeln. Das bekannteste Einsatzgebiet sind statische Bibliotheken wie libfoo.a, die der Linker beim Bau eines Programms durchsucht.

Grundaufrufe

ar rcs libfoo.a foo.o bar.o   # r=ersetzen/einfügen, c=anlegen, s=Symbolindex
ar t libfoo.a                 # Mitglieder auflisten
ar x libfoo.a foo.o           # Mitglied extrahieren
ar d libfoo.a foo.o           # Mitglied löschen
ar p libfoo.a foo.o           # Mitglied auf stdout ausgeben
ar m libfoo.a foo.o           # Mitglied im Archiv verschieben

Wichtige Optionen

  • r — Datei in das Archiv aufnehmen (ersetzt ein Mitglied mit gleichem Namen)
  • c — Archiv still anlegen (unterdrückt die Warnung, wenn es neu ist)
  • s — Symbolindex schreiben (wie ein ranlib-Aufruf)
  • t — Inhaltsverzeichnis; x — extrahieren; d — löschen; q — schnell anhängen ohne Duplikatprüfung
  • S — keinen Symbolindex erzeugen; u — nur neuere Dateien aufnehmen
  • a/b/i — nach/vor einem bestimmten Mitglied einfügen (Position steuern)
  • --thin — Thin Archive: nur Verweise auf die Objektdateien statt Kopien (spart Platz im Build-Baum)

Wie der Linker Archive nutzt

Anders als Objektdateien zieht der Linker aus einem Archiv nur die Mitglieder, die gerade fehlende Symbole auflösen. Die Reihenfolge spielt dabei eine Rolle: Wer -lfoo nutzt, sollte die Bibliothek hinter den Objektdateien nennen, die ihre Funktionen brauchen. Enthält das Archiv keinen Symbolindex (zum Beispiel nach ar q ohne s), muss ranlib ihn nachtragen, sonst findet der Linker die Symbole nicht.

Praxis-Tipps

  • ar rcs libfoo.a *.o baut aus allen Objektdateien eines Verzeichnisses eine statische Bibliothek
  • Nach dem Linken ist eine statische Bibliothek nicht mehr nötig — das Programm trägt den Code bereits in sich
  • Mit ar t libfoo.a und nm-Befehle prüft man, welche Symbole ein Archiv wirklich anbietet
  • Diagnose: „archive has no index" beim Linken bedeutet, dass der Symbolindex fehlt — ranlib libfoo.a behebt das

Verwandte Grundlagen: ranlib-Befehle (Index nachtragen), strip-Befehle (Archive verschlanken), Bibliothek.