nm (Unix)
O nm é um comando fornecido com várias versões do Unix e sistemas operacionais semelhantes.[1] 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).[2] 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
editarO comando nm representa o tipo de símbolo presente no arquivo usando caracteres (símbolos fracos são representados igualmente aos símbolos globais):[2]
Item | Descrição |
---|---|
A | Símbolo absoluto global |
A | Símbolo absoluto local |
B | Símbolo global de bss |
B | Símbolo de bss local |
D | Símbolo de dado global |
D | Símbolo de dado local |
f | Símbolo do nome do arquivo de origem |
L | Símbolo thread-local global |
l | Símbolo thread-local estático |
T | Símbolo de texto global |
T | Símbolo de texto local |
U | Símbolo indefinido |
Exemplo de saída
editar/*
* 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
editarReferências
- ↑ «nm(1) - Linux manual page». man7 org. Consultado em 5 de junho de 2024
- ↑ a b «Comando nm». IBM. Consultado em 5 de junho de 2024
Ligações externas
editar- « (em inglês). . Seção Commands & utilities reference. : write the name list of an object file»Especificação Única do Unix. 7 ed. The Open Group, 2013. templatestyles stripmarker character in
|título=
at position 37 (ajuda)