ranlib erzeugt den Symbolindex einer Archivdatei — also einer statischen Bibliothek wie libfoo.a. Dieser Index verrät dem Linker, welches Mitglied welches Symbol definiert, sodass er beim Auflösen von Referenzen nicht das ganze Archiv durchsuchen muss.

Grundaufrufe

ranlib libfoo.a          # Symbolindex erzeugen/aktualisieren
ranlib -t libfoo.a       # nur aktualisieren, wenn der Index fehlt (touch)
ranlib -v libfoo.a       # ausführliche Ausgabe
ranlib -D libfoo.a       # deterministische Ausgabe (symmetrisch zum ar -D-Standard)

Zusammenspiel mit ar

  • Das s-Kommando von ar-Befehle (zum Beispiel ar rcs) schreibt denselben Index — wer immer rcs nutzt, braucht ranlib nicht extra aufzurufen
  • Nach ar q (schnelles Anhängen) oder ar d/ar m ohne s kann der Index fehlen oder veralten
  • Der Index entspricht der Ausgabe von nm -s: Er listet die global definierten Symbole je Mitglied
  • GNU ar ruft ranlib intern auf; auf klassischen Systemen war ranlib ein eigenständiger Schritt nach jeder Archivänderung

Warum der Index wichtig ist

Beim Linken gegen eine statische Bibliothek prüft der Linker zuerst den Index und zieht nur die Mitglieder ein, die fehlende Symbole liefern. Fehlt der Index, meldet der Linker „archive has no index" oder findet Symbole nicht — besonders, wenn Mitglieder sich gegenseitig referenzieren. Ein ranlib libfoo.a nach jeder Änderung hält das Archiv benutzbar.

Praxis-Tipps

  • Nach dem manuellen Umbau eines Archivs mit ar d/ar m immer ranlib nachziehen
  • Wurde eine Bibliothek mit strip-Befehlen verschlankt, läuft ranlib direkt danach — so listet der Index nur noch die verbliebenen Symbole
  • ranlib -t ist die sanfte Variante für Skripte: Es ändert nur veraltete oder fehlende Indizes
  • Deterministische Archive (-D, seit ar/binutils Standard) erzeugen reproduzierbare Builds — gleiche Eingaben, bytegleiche Bibliothek
  • Die meisten Build-Systeme rufen ar und ranlib automatisch über die Werkzeuge-Variablen AR und RANLIB auf

Verwandte Grundlagen: ar-Befehle (Archive bauen), nm-Befehle (Symbole anzeigen), Linker.