Articulo de referencia

nm (Unix)

[[Ken Thompson]] ([[AT&T Bell Laboratories]])"},"developer":{"wt":"Various [[open-source software|open-source]] and [[commercial software|commercial]] developers"},"released":{"...

nmes un comando de Unix que se utiliza para volcar la tabla de símbolos y sus atributos de un archivo ejecutable binario (incluidas bibliotecas , módulos de objetos compilados , archivos de objetos compartidos y ejecutables independientes ).

La salida nmdistingue entre varios tipos de símbolos. Por ejemplo, diferencia entre una función proporcionada por un módulo objeto y una función requerida por este. nmSe utiliza como ayuda para la depuración , para ayudar a resolver problemas derivados de conflictos de nombres y manipulación de nombres de C++ , y para validar otras partes de la cadena de herramientas .

Este comando viene incluido en varias versiones posteriores de Unix y sistemas operativos similares , incluido Plan 9. El Proyecto GNU incluye una implementación como parte del paquete GNU Binutils .nm

La etimología es que en la antigua versión 7 de Unix, nmla página de manual de utilizaba el término lista de nombres en lugar de tabla de símbolos . [ 1 ]

muestra de salida de nm

/* * Nombre del archivo: test.c * Para código C, compile con: * gcc -c test.c * * Para código C++, compile con: * g++ -c test.cpp */int var_global ; 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 () { // No hago nada }int main ( void ) { global_var = 1 ; static_var = 2 ;devolver 0 ; }

Si el código anterior se compila con el compilador C gcc , la salida del nmcomando es la siguiente:

# 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

Cuando se utiliza el compilador de C++, la salida es diferente:

# 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

Las diferencias entre los resultados también muestran un ejemplo de cómo resolver el problema de la modificación de nombres mediante el uso de extern "C" en código C++.

Véase también

Referencias

  1. "NM(1)" . Manual de comandos generales de la séptima edición de Unix . Archivado del original el 5 de enero de 2026. Consultado el 14 de marzo de 2025 .