O comando nm é fornecido com várias versões posteriores do Unix e sistemas operacionais semelhantes.[1] Ele é usado para examinar arquivos binários (incluindo bibliotecas, módulos de objetos compilados, arquivos de objeto compartilhados e executáveis independentes) e para exibir o conteúdo desses arquivos, ou meta informações armazenados neles, especificamente a tabela de símbolos. A saída 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 em C++, e para validar outras partes do cadeia de ferramentas.

O Projeto GNU envia uma implementação de nm como parte do pacote GNU Binutils.

Exemplo de saída do nm 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 editar

Referências

Ligações externas editar


  Este artigo sobre Unix é um esboço. Você pode ajudar a Wikipédia expandindo-o.