Ricerca nel sito web

Tutorial sui comandi Linux nm per principianti (10 esempi)


Su questa pagina

  1. Comando Linux nm
  2. D1. Come funziona il comando nm?
  3. Q2. Come fare in modo che i nomi dei file precedano ogni simbolo nell'output?
  4. Q3. Come fare in modo che nm visualizzi anche i simboli del debugger?
  5. Q4. Come fare in modo che nm decodifichi i nomi dei simboli di basso livello?
  6. D5. Come fare in modo che nm mostri solo simboli dinamici?
  7. D6. Come utilizzare diversi formati di output nm?
  8. D7. Come fare in modo che nm mostri solo simboli esterni?
  9. D8. Quali sono tutte le opzioni di ordinamento fornite da nm?
  10. D9. Come fare in modo che nm visualizzi solo simboli non definiti?
  11. D10. Come fare in modo che nm visualizzi solo simboli definiti?
  12. Conclusione

Se sei un utente Linux che si occupa anche di codifica e sviluppo di software a livello di sistema, potresti trovarti in situazioni in cui hai bisogno di informazioni relative ai simboli in un file oggetto. Sarai felice di sapere che esiste un'utility a riga di comando - soprannominata nm - che puoi usare in queste situazioni.

In questo tutorial, discuteremo le basi di questo strumento utilizzando alcuni esempi di facile comprensione. Ma prima di farlo, vale la pena ricordare che tutti gli esempi qui sono stati testati su una macchina Ubuntu 22.04 LTS.

Comando linux nm

L'utilità della riga di comando nm elenca fondamentalmente i simboli dai file oggetto. Ecco la sintassi degli strumenti:

nm [OPTIONS] OBJECT-FILENAME

E di seguito è come la pagina man dei comandi lo spiega:

       GNU nm lists the symbols from object files objfile....  If no object
       files are listed as arguments, nm assumes the file a.out.

Di seguito sono riportati alcuni esempi in stile Q&A che ti daranno un'idea migliore di come funziona nm.

Q1. Come funziona il comando nm?

L'utilizzo di base di questo comando è molto semplice: tutto ciò che devi fare è eseguire il comando nm e passargli il nome del file oggetto come input. Ad esempio, ho usato il comando nm con il file binario apl:

nm apl

Lo screenshot seguente mostra il tipo di output prodotto dal comando precedente:

Le tre colonne prodotte nell'output rappresentano rispettivamente il valore del simbolo, il tipo di simbolo e il nome del simbolo. Esistono diversi tipi di simboli: per conoscere i dettagli completi, vai alla pagina man del comando nm.

D2. Come fare in modo che i nomi dei file precedano ogni simbolo nell'output?

Puoi farlo usando l'opzione della riga di comando -A.

nm -A [obj-file]

Per esempio:

nm -A apl

Quindi puoi vedere che il nome del file è stato aggiunto all'inizio di ogni riga.

D3. Come fare in modo che nm visualizzi anche i simboli del debugger?

Per fare in modo che nm visualizzi anche i simboli del debugger nell'output, utilizzare l'opzione della riga di comando -a.

nm -a [obj-filename]

Per esempio:

nm -a apl

Il comando precedente visualizzerà tutti i simboli, inclusi i simboli solo del debugger che normalmente non sono elencati.

D4. Come fare in modo che nm decodifichi i nomi dei simboli di basso livello?

Se lo desideri, puoi persino forzare nm a decodificare i nomi dei simboli di basso livello in nomi a livello utente. Puoi farlo usando l'opzione della riga di comando -C.

nm -C [obj-file]

Per esempio:

nm -C apl

Ecco cosa ha da dire la pagina man su questa opzione:

           Besides removing any initial underscore prepended by the system,
           this makes C++ function names readable. Different compilers have
           different mangling styles. The optional demangling style argument
           can be used to choose an appropriate demangling style for your
           compiler.

Q5. Come fare in modo che nm mostri solo simboli dinamici?

Nel caso in cui desideri che nm visualizzi solo i simboli dinamici, piuttosto che i simboli normali, usa l'opzione della riga di comando -D.

nm -D [obj-file]

Per esempio:

nm -D apl

Quindi puoi vedere che nm ha prodotto solo simboli dinamici nell'output.

D6. Come utilizzare diversi formati di output nm?

Per abilitare diversi formati di output, utilizzare l'opzione della riga di comando -f. Per impostazione predefinita, l'output viene prodotto nel formato bsd, tuttavia, se lo desideri, puoi abilitare anche i formati sysv e posix.

nm -f [format] [obj-filename]

Per esempio:

nm -f posix apl

Osserva ora il cambiamento nel formato.

D7. Come fare in modo che nm mostri solo simboli esterni?

Ciò è possibile ottenere utilizzando l'opzione della riga di comando -g.

nm -g [obj-file]

Per esempio:

nm -g  apl

D8. Quali sono tutte le opzioni di ordinamento fornite da nm?

Per impostazione predefinita, i simboli sono ordinati alfabeticamente. Tuttavia, se lo desideri, puoi ordinarli numericamente in base ai loro indirizzi utilizzando l'opzione della riga di comando -n.

nm -n [objfile]

Per esempio:

nm -n apl

Quindi puoi vedere che l'output è ordinato per indirizzi ora.

Nel caso in cui non desideri che nm applichi alcun tipo di ordinamento (incluso quello predefinito che utilizza), utilizza l'opzione della riga di comando -p. Andando avanti, per invertire qualsiasi ordinamento esistente, utilizzare l'opzione della riga di comando -r.

D9. Come fare in modo che nm visualizzi solo simboli non definiti?

Puoi farlo usando l'opzione della riga di comando -u.

nm -u [obj-file]

Per esempio:

nm -u apl

Q10. Come fare in modo che nm visualizzi solo simboli definiti?

Per fare in modo che nm visualizzi solo i simboli definiti, utilizzare l'opzione della riga di comando --defined-only.

nm --defined-only [obj-file]

Per esempio:

nm --defined-only apl

Conclusione

D'accordo, il comando nm ha un pubblico di nicchia, ma la mia esperienza personale dice che anche se non ti consideri parte di quel pubblico, tieni presente che esiste uno strumento del genere. E per coloro che desiderano utilizzare questa utilità, una volta terminata la pratica di tutti gli esempi qui, vai alla pagina man di nm per saperne di più.