Linux nm-Befehl
nmEs ist ein wichtiges Kommandozeilenwerkzeug in Linux-Systemen, mit dem vollständigen Namen "Name List". Es wird verwendet, um Symbolinformationen in binären Objektdateien (wie Bibliotheksdateien und ausführbare Dateien) anzuzeigen, und ist ein verbreitetes Werkzeug für Programmierer und zur Analyse von Binärdateien.
Hauptfunktionen
- Symbole (Funktionen, Variablen usw.) in Objektdateien auflisten
- Symboltypen und -attribute anzeigen
- Beim Analysieren von Programmverlinkungsproblemen helfen
- Beim Debugging und Reverse Engineering unterstützen
Grundlegende Syntax
nm [选项] 文件名
Häufige Optionsparameter
| Option | Beschreibung |
|---|---|
-a |
Alle Symbole anzeigen, einschließlich Debug-Symbole |
-g |
Nur externe (globale) Symbole anzeigen |
-u |
Nur undefinierte Symbole anzeigen |
-D |
Dynamische Symbole anzeigen (für gemeinsam genutzte Bibliotheken) |
-C |
C++-Symbolnamen demangeln |
-l |
Zeilennummern anzeigen, an denen sich Symbole befinden (erfordert Debug-Informationen) |
-S |
Symbolgrößen anzeigen |
-t |
Ausgabeformat angeben (d-dezimal, o-oktal, x-hexadezimal) |
--size-sort |
Nach Symbolgröße sortieren |
--defined-only |
Nur definierte Symbole anzeigen |
Symboltyp Beschreibung
nmDer Symboltyp in der Ausgabe wird durch einen Buchstaben dargestellt; gebräuchliche sind:
| Type | Beschreibung |
|---|---|
| A | Absolutes Symbol, zur Linkzeit nicht geändert |
| B/b | Symbol im uninitialisierten Datensegment (BSS-Segment) |
| D/d | Symbol im initialisierten Datensegment |
| T/t | Symbol im Codesegment (T für global, t für lokal) |
| U | Undefiniertes Symbol (muss aus anderen Dateien gelinkt werden) |
| W/w | Schwaches Symbol |
| R/r | Symbol im Nur-Lese-Datensegment |
| C | Common-Symbol |
| I | Indirekte Referenz auf ein anderes Symbol |
Praktische Anwendungsbeispiele
Beispiel 1: Symboltabelle einer ausführbaren Datei anzeigen
nm /bin/ls
Beispielausgabe:
0000000000000000 A _IO_stdin_used 0000000000000000 R _fp_hw 0000000000000000 T _init 0000000000000000 W _ITM_deregisterTMCloneTable 0000000000000000 W _ITM_registerTMCloneTable 0000000000000000 W __cxa_finalize 0000000000000000 W __gmon_start__ 0000000000000000 T __libc_csu_fini 0000000000000000 T __libc_csu_init ...
Beispiel 2: Nur undefinierte Symbole anzeigen
nm -u /bin/ls
Beispielausgabe:
U __ctype_toupper_loc
U __errno_location
U __overflow
U __stack_chk_fail
U __strtoul_internal
U _obstack_begin
U _obstack_newchunk
U abort
U access
...
Beispiel 3: Symbole eines C++-Programms anzeigen (demanglete Namen)
nm -C my_program
Beispielausgabe:
0000000000000000 T main 0000000000000000 T std::cout 0000000000000000 T std::basic_ostream<char, std::char_traits >& std::operator<< <std::char_traits >(std::basic_ostream<char, std::char_traits >&, char const*) ...
Beispiel 4: Symbolgrößen anzeigen und nach Größe sortieren
nm -S --size-sort my_library.so
Beispielausgabe:
0000000000000001 0000000000000001 T func1 0000000000000002 0000000000000002 T func2 0000000000000004 0000000000000004 D global_var 0000000000000008 0000000000000008 B large_buffer ...
Häufige Anwendungsfälle
1. Linker-Fehler beheben
Wenn ein "undefined reference"-Fehler auftritt, können Sie verwendennmPrüfen Sie, welche Symbole undefiniert sind:
nm -u my_program.o
2. Analyse des Inhalts von Bibliotheksdateien
Von einer Shared Library exportierte Symbole anzeigen:
nm -D libexample.so
3. Vergleich zweier Versionen einer Binärdatei
Beispiel
nm new_version > new.txt
diff old.txt new.txt
4. Suchen nach bestimmten Symbolen
nm my_program | grep "main"
Hinweise
- Bei gestrippten Binärdateien,
nmNützliche Informationen werden möglicherweise nicht angezeigt - Bei Binärdateien unterschiedlicher Architekturen ist möglicherweise die Verwendung des Werkzeugs aus der Cross-Compilation-Toolchain erforderlich
nm - Dynamische Symbole (in Shared Libraries) müssen mit dem
-DOption zum Anzeigen - Für C++-Programme wird empfohlen, immer die
-COption zum Demangeln von Symbolnamen
Fortgeschrittene Tipps
Kombination mit anderen Werkzeugen
Beispiel
objdump -t my_program
# readelf verwenden, um Header-Informationen der ELF-Datei anzuzeigen
readelf -s my_program
Skripte zum Analysieren von Symbolen schreiben
Beispiel
# Verteilung der Symboltypen zählen
nm $1 | awk '{print $2}' | sort | uniq -c | sort -nr
Erstellen von Symbolzuordnungsdateien
nm -n my_program > symbol_map.txt
Zusammenfassung
nmDer Befehl ist eines der wichtigen Werkzeuge für Linux-Entwickler. Wenn Sie ihn beherrschen, können Sie:
- Programmstruktur besser verstehen
- Linker-Probleme schnell lokalisieren
- Inhalte von Drittanbieter-Bibliotheken analysieren
- Beim Debugging und Reverse Engineering unterstützen
Durch die in diesem Artikel vorgestellte grundlegende Verwendung und praktische Beispiele sollten Sie dienmKernfunktionalität des Befehls beherrschen. In der tatsächlichen Arbeit können Sie verschiedene Optionen und Parameter flexibel nach spezifischen Anforderungen verwenden.
Andere Erweiterungen
Linux-Befehlsreferenz