Linux nm-Befehl

Linux 命令大全Linux-Befehlsreferenz


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 old_version > old.txt
nm new_version > new.txt
diff old.txt new.txt

4. Suchen nach bestimmten Symbolen

nm my_program | grep "main"

Hinweise

  1. Bei gestrippten Binärdateien,nmNützliche Informationen werden möglicherweise nicht angezeigt
  2. Bei Binärdateien unterschiedlicher Architekturen ist möglicherweise die Verwendung des Werkzeugs aus der Cross-Compilation-Toolchain erforderlichnm
  3. Dynamische Symbole (in Shared Libraries) müssen mit dem-DOption zum Anzeigen
  4. Für C++-Programme wird empfohlen, immer die-COption zum Demangeln von Symbolnamen

Fortgeschrittene Tipps

Kombination mit anderen Werkzeugen

Beispiel

# objdump verwenden, um detailliertere Symbolinformationen anzuzeigen
objdump -t my_program

# readelf verwenden, um Header-Informationen der ELF-Datei anzuzeigen
readelf -s my_program

Skripte zum Analysieren von Symbolen schreiben

Beispiel

#!/bin/bash
# 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.


Linux 命令大全Linux-Befehlsreferenz

Andere Erweiterungen