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 = lokal
  • U — undefined: Referenz auf ein Symbol, das in einer anderen Datei definiert sein muss
  • B/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 exportiert
  • nm -u datei.o listet fehlende Referenzen — nützlich, um „undefined reference"-Linkerfehler vor dem Linken zu erkennen
  • nm -C programm | grep meinfunktion findet ein C++-Symbol in lesbarer Form
  • nm -s libfoo.a zeigt 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).