nm aus den GNU Binutils listet die Symbole aus Objektdateien, ausführbaren Programmen und Bibliotheken auf. Jede Zeile zeigt den Symbolwert in Hex, einen Symboltyp und den Namen — damit lässt sich die Symboltabelle einer Datei gezielt durchsuchen.
Die wichtigsten Optionen
nm datei.o # alle Symbole der Objektdatei
nm -D programm # nur dynamische Symbole (exportierte Funktionen)
nm -C programm # C++-Namen entmischen (Demangling)
nm -u datei.o # nur undefined Symbole
nm -g datei.o # nur globale Symbole
nm -n datei.o # numerisch sortiert nach Adresse
nm -S datei.o # zusätzlich Symbolgröße anzeigen
Symboltypen verstehen
T/t— Symbol im Code-Segment (Text); Großbuchstabe = global, Kleinbuchstabe = lokalU— undefined: Referenz auf ein Symbol, das in einer anderen Datei definiert sein mussB/b— Symbol im BSS-Segment (nicht initialisierte Daten)D/d— initialisierte Daten;W/w— weak symbol
Praxis-Beispiele
nm -D libfoo.so | grep ' T 'zeigt die Funktionen, die eine Shared Library wirklich exportiertnm -u datei.olistet fehlende Referenzen — nützlich, um „undefined reference"-Linkerfehler vor dem Linken zu erkennennm -C programm | grep meinfunktionfindet ein C++-Symbol in lesbarer Formnm -s libfoo.azeigt den Symbolindex eines Archivs — dieselbe Tabelle, die ranlib-Befehle schreiben- Kein Dateiname angegeben: nm liest standardmäßig
a.out
Einordnung
Während objdump-Befehle ganze Sektionen anzeigen und readelf-Befehle die ELF-Struktur beschreiben, konzentriert sich nm auf die Symbole selbst. Die Linker und der Compiler erzeugen diese Tabelle; nm macht sie sichtbar.
Verwandte Grundlagen: addr2line-Befehle (Adressen auflösen), ld-Befehle (Linken).