strip aus den GNU Binutils entfernt Symbole und Debug-Informationen aus Objektdateien, ausführbaren Programmen und Archiven. Das verkleinert Binärdateien deutlich — in Produktivsystemen und Containern ist gestrippter Code der Standard, während Entwickler-Builds die Debug-Symbole behalten.
Grundaufrufe
strip programm # alle Symbole entfernen (Datei wird direkt verändert)
strip --strip-debug prog # nur Debug-Informationen entfernen
strip --strip-unneeded o # nur für die Relokation unnötige Symbole entfernen
strip -o prog.klein prog # Ausgabe in eine neue Datei schreiben
strip --strip-all lib.a # alle Mitglieder eines Archivs strippen
Wichtige Optionen
-s/--strip-all— alle Symbole entfernen;-g/-S/-d/--strip-debug— nur Debug-Informationen--strip-unneeded— entfernt nur Symbole, die für die Relokation nicht gebraucht werden (schonender für Bibliotheken)-K name/--keep-symbol— bestimmte Symbole behalten;-N name/--strip-symbol— gezielt entfernen-o datei— Ergebnis in eine separate Datei schreiben statt die Eingabe zu verändern--only-keep-debug— nur die Debug-Sektionen behalten (Gegenstück für die zweiteilige Debug-Lösung)
Zweiteilige Debug-Info (mit objcopy)
Wer die Debug-Informationen nicht ganz verlieren will, nutzt die klassische Kombination: objcopy --only-keep-debug programm programm.dbg legt eine Datei nur mit Debug-Daten an, strip --strip-debug programm entfernt sie aus dem Programm und objcopy --add-gnu-debuglink=programm.dbg programm trägt den Verweis ein. Der Debugger findet die Symbole dann über den Debuglink — ausführlich erklärt bei den objcopy-Befehlen.
Praxis-Tipps
- Distributions-Pakete strippen Binärdateien standardmäßig und liefern Debug-Symbole als separate Pakete
- Vor dem Strippen ein Backup behalten: Ohne Symbole sind Stack-Traces nur noch Adressen (es sei denn, man löst sie per addr2line-Befehle mit einer .dbg-Datei auf)
strip libfoo.astrippt alle Mitglieder des Archivs — nachherranliblaufen lassen, damit der Index aktuell bleibt (siehe ranlib-Befehle)- Größenvergleich:
size programmzeigt vorher/nachher, wie viel Platz die Symbole kosteten (siehe size-Befehle)
Verwandte Grundlagen: objcopy-Befehle (Debuglink), ar-Befehle (Archive), Symboltabelle.
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üfungS— keinen Symbolindex erzeugen;u— nur neuere Dateien aufnehmena/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 *.obaut 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.aund 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.abehebt das
Verwandte Grundlagen: ranlib-Befehle (Index nachtragen), strip-Befehle (Archive verschlanken), Bibliothek.
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 Beispielar rcs) schreibt denselben Index — wer immerrcsnutzt, braucht ranlib nicht extra aufzurufen - Nach
ar q(schnelles Anhängen) oderar d/ar mohneskann 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 mimmerranlibnachziehen - Wurde eine Bibliothek mit strip-Befehlen verschlankt, läuft ranlib direkt danach — so listet der Index nur noch die verbliebenen Symbole
ranlib -tist 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
ARundRANLIBauf
Verwandte Grundlagen: ar-Befehle (Archive bauen), nm-Befehle (Symbole anzeigen), Linker.
strings aus den GNU Binutils durchsucht Binärdateien nach zusammenhängenden, druckbaren Zeichenfolgen und gibt sie aus. Fehlermeldungen, Pfade, Versionsstrings, URLs oder versteckte Kennungen bleiben als Text im Binärcode erhalten — strings macht sie sichtbar, ohne dass man die Datei disassemblieren muss.
strings /bin/ls
strings -n 8 firmware.bin
Wichtige Optionen
-n N/--min-length=N: Mindestlänge der Zeichenfolge (Standard: 4 Zeichen).-t d|x|o: Offset jeder Zeichenfolge in dezimal, hexadezimal oder oktal — wichtig, um die Fundstelle in der Datei wiederzufinden.-e s|S|b|l: Zeichenbreite beziehungsweise Byte-Reihenfolge (7-Bit, 8-Bit, 16-Bit Big- oder Little-Endian;-e lfindet UTF-16-Texte).-a/--all: ganze Datei scannen statt nur initialisierte Sektionen.-f: Dateiname vor jeder Zeichenfolge bei mehreren Dateien.
Einsatz in Forensik und Analyse
Bei der Incident Response und in CTF-Aufgaben fördert strings oft versteckte Flags, Kommandozeilen, IP-Adressen oder verdächtige Pfade aus einem Prozess-Abbild zutage, bevor man mit objdump oder readelf in die Details einsteigt. Die Kombination aus -n und -t liefert gezielt lange Kennungen samt Offset.
strings -n 10 -t x verdaechtige.bin
strings arbeitet auf der Ebene der Maschinensprache und ergänzt die Schwesterwerkzeuge der Binutils-Kette: nm für Symbole, objcopy für den Umbau, size für Größen.
Verwandte Grundlagen: objcopy-Befehle, size-Befehle, Symboltabelle.
objcopy ist ein Werkzeug aus den GNU Binutils, das Objektdateien und ausführbare Dateien kopiert und dabei gezielt umbaut: Sektionen entfernen, hinzufügen oder umbenennen, Formate konvertieren und Debug-Informationen auslagern. Es ist der Allrounder für alles, was unterhalb der Compiler-Ebene mit dem Datei- und Sektionslayout passiert.
Formate konvertieren
Mit -O (output target) legt man das Ausgabeformat fest. Der wichtigste Fall für die Embedded-Entwicklung ist -O binary: objcopy erzeugt ein rohes Speicherabbild ohne ELF-Header, Relokationen und Symbole — genau das, was man für Firmware oder Bootloader direkt auf den Flash schreiben kann.
objcopy -O binary -R .eh_frame firmware.elf firmware.bin
objcopy -O ihex program.elf program.hex
Debug-Informationen auslagern
Kombiniert man --only-keep-debug und --add-gnu-debuglink, entsteht eine zweiteilige Distribution: eine schlanke Binärdatei für den Betrieb und eine separate Debug-Datei für den Debugger. gdb sucht die Debug-Datei automatisch über den eingebetteten Debuglink.
objcopy --only-keep-debug program program.debug
objcopy --add-gnu-debuglink=program.debug program
strip program
Sektionen manipulieren
-S bzw. --strip-all entfernt die Symboltabelle (siehe strip-Befehle), --remove-section .comment löscht einzelne Sektionen, --only-section .text extrahiert genau eine Sektion, --rename-section und --redefine-sym benennen Sektionen beziehungsweise Symbole um. Damit lassen sich Binärdateien für spezielle Ladeadressen anpassen (--change-addresses). Wie nm und objdump gehört objcopy zur Analyse- und Umbau-Kette rund um Linker und Compiler.
Verwandte Grundlagen: size-Befehle, strings-Befehle, readelf-Befehle.