Zum Inhalt springen
hanse-computing.de
  • Moin
  • Über uns
  • Leistungen
  • Projekte
  • Neuigkeiten
  • Wissen
    • Netzwerktechniken
    • Systemadministration
    • Hardware-Spezifikationen
    • KI & Automatisierung
    • Glossar
      • Fachbegriffe
      • Programmiersprachen-Befehle
    • Datenbanken
    • IT-Grundlagen
    • Python: Grundlagen
    • Python: Datenstrukturen
    • Python: Dateien & IO
    • Python: Web & Frameworks
    • Python: Fehler & Debugging
    • Webentwicklung
    • Linux & Betriebssysteme
    • IT-Sicherheit
    • Cloud & Container
    • Tools & Software
    • Netzwerk: TCP/IP
    • Netzwerk: DNS & Dienste
    • Netzwerk: Sicherheit
    • Netzwerk: Tools
    • KI: Grundlagen
    • KI: Praxis
    • KI: LLM & Agenten
    • Hardware: Server
    • Hardware: Netzwerkgeräte
    • Hardware: Peripherie
    • Wiki-Startseite
    • Letzte Änderungen
    • Kategorie-Browser
    • Zufallsartikel
  • Infrastruktur
  • AI Easy Start
  • Test-Drive
  • Kontakt
  • Impressum
  • Datenschutz

Sprache auswählen

  • Deutsch (Deutschland)
  • English (United Kingdom)
  1. Aktuelle Seite:  
  2. Startseite
  3. Wissen
  4. Glossar
  5. Programmiersprachen-Befehle

strip-Befehle: Symbole und Debug-Informationen entfernen (GNU Binutils)

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.a strippt alle Mitglieder des Archivs — nachher ranlib laufen lassen, damit der Index aktuell bleibt (siehe ranlib-Befehle)
  • Größenvergleich: size programm zeigt vorher/nachher, wie viel Platz die Symbole kosteten (siehe size-Befehle)

Verwandte Grundlagen: objcopy-Befehle (Debuglink), ar-Befehle (Archive), Symboltabelle.

ar-Befehle: Archive erstellen und verwalten (GNU Binutils)

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.

ranlib-Befehle: Symbolindex für Archive erzeugen (GNU Binutils)

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.

strings-Befehle: Text aus Binärdateien extrahieren (GNU Binutils)

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 l findet 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-Befehle: Objektdateien kopieren und umbauen (GNU Binutils)

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.

  1. size-Befehle: Sektionsgrößen ermitteln (GNU Binutils)
  2. nm-Befehle: Symboltabellen auslesen (GNU Binutils)
  3. addr2line-Befehle: Adressen in Quellcode-Stellen übersetzen
  4. ld-Befehle: Objektdateien zu Programmen linken

Seite 4 von 46

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
hanse-computing.de

hanse-computing.de – KI-gestützte Dienstleistungen aus Lübeck.

hanse-computing.de
IT-Dienstleistungen aus der Hansestadt
Über uns · Projekte · Neuigkeiten · Affiliate
Impressum · Datenschutz
© 2026 hanse-computing.de
© 2026 hanse-computing Impressum Datenschutz