O nm é um comando fornecido com várias versões do Unix e sistemas operacionais semelhantes. Ele é usado para examinar a tabela de símbolos ou as meta informações presente nos arquivos binários (incluindo bibliotecas, módulos de objetos compilados, arquivos de objeto compartilhados e, executáveis independentes). Auxilia a depuração com informações que identificam as funções, as variáveis e, os tipos de dados.
A resposta do nm distingue entre vários tipos de símbolos. Por exemplo, ela diferencia entre uma função que é fornecida por um módulo objeto e uma função que é exigida por ele. O nm é usado como um auxílio para depuração, para ajudar a resolver problemas decorrentes de conflitos de decoração de nomes na programação C++, e para validar outras partes da cadeia de ferramentas.
O Projeto GNU envia uma implementação de nm como parte do pacote GNU Binutils.
Tipo de símbolo O comando nm representa o tipo de símbolo presente no arquivo usando caracteres (símbolos fracos são representados igualmente aos símbolos globais): ItemDescriçãoASímbolo absoluto globalASímbolo absoluto localBSímbolo global de bssBSímbolo de bss localDSímbolo de dado globalDSímbolo de dado localfSímbolo do nome do arquivo de origemLSímbolo thread-local global lSímbolo thread-local estáticoTSímbolo de texto globalTSímbolo de texto localUSímbolo indefinido
Exemplo de saída /* * File name: test.c * For C code compile with: * gcc -c test.c * * For C++ code compile with: * g++ -c test.cpp */
int global_var; int global_var_init = 26;
static int static_var; static int static_var_init = 25;
static int static_function() { return 0; }
int global_function(int p) { static int local_static_var; static int local_static_var_init=5;
local_static_var = p;
return local_static_var_init + local_static_var; }
int global_function2() { int x; int y; return x+y; }
#ifdef __cplusplus extern "C" #endif void non_mangled_function() { // I do nothing }
int main(void) { global_var = 1; static_var = 2;
return 0; }
Se o código anterior é compilado com o compilador C do gcc, a saída do comando nm é a seguinte: # nm test.o 0000000a T global_function 00000025 T global_function2 00000004 C global_var 00000000 D global_var_init 00000004 b local_static_var.1255 00000008 d local_static_var_init.1256 0000003b T main 00000036 T non_mangled_function 00000000 t static_function 00000000 b static_var 00000004 d static_var_init
Quando o complilador C++ é usado, a saída difere: # nm test.o 0000000a T _Z15global_functioni 00000025 T _Z16global_function2v 00000004 b _ZL10static_var 00000000 t _ZL15static_functionv 00000004 d _ZL15static_var_init 00000008 b _ZZ15global_functioniE16local_static_var 00000008 d _ZZ15global_functioniE21local_static_var_init U __gxx_personality_v0 00000000 B global_var 00000000 D global_var_init 0000003b T main 00000036 T non_mangled_function
As diferenças entre as saídas também mostram um exemplo de solução do problema de mangling de nomes usando "C" externo no código C++.
Ver também Objdump
Ligações externas
Categoria:Ferramentas de programação para Unix Categoria:Utilitários Unix SUS2008