| nm | |
|---|---|
| Original authors | Dennis Ritchie, Ken Thompson (AT&T Bell Laboratories) |
| Developers | Variousopen-source andcommercial developers |
| Initial release | November 3, 1971; 54 years ago (1971-11-03) |
| Written in | C |
| Operating system | Unix,Unix-like,Plan 9 |
| Platform | Cross-platform |
| Type | Command |
| License | Plan 9:MIT License |
nm is aUnix command used to dump thesymbol table and their attributes from abinaryexecutable file (includinglibraries, compiledobject modules, shared-object files, and standaloneexecutables).
The output fromnm distinguishes between various symbol types. For example, it differentiates between afunction that is supplied by an object module and a function that is required by it.nm is used as an aid fordebugging, to help resolve problems arising from name conflicts andC++ name mangling, and to validate other parts of thetoolchain.
This command is shipped with a number of later versions ofUnix andsimilaroperating systems includingPlan 9. TheGNU Project ships an implementation ofnm as part of theGNU Binutils package.
The etymology is that in the old Version 7 Unix,nm's manpage used the termname list instead ofsymbol table.[1]
/* * File name: test.c * For C code compile with: * gcc -c test.c * * For C++ code compile with: * g++ -c test.cpp */intglobal_var;intglobal_var_init=26;staticintstatic_var;staticintstatic_var_init=25;staticintstatic_function(){return0;}intglobal_function(intp){staticintlocal_static_var;staticintlocal_static_var_init=5;local_static_var=p;returnlocal_static_var_init+local_static_var;}intglobal_function2(){intx;inty;returnx+y;}#ifdef __cplusplusextern"C"#endifvoidnon_mangled_function(){// I do nothing}intmain(void){global_var=1;static_var=2;return0;}
If the previous code is compiled with thegcc C compiler, the output of thenm command is the following:
#nmtest.o0000000a T global_function00000025 T global_function200000004 C global_var00000000 D global_var_init00000004 b local_static_var.125500000008 d local_static_var_init.12560000003b T main00000036 T non_mangled_function00000000 t static_function00000000 b static_var00000004 d static_var_init
When the C++ compiler is used, the output differs:
#nmtest.o0000000a T _Z15global_functioni00000025 T _Z16global_function2v00000004 b _ZL10static_var00000000 t _ZL15static_functionv00000004 d _ZL15static_var_init00000008 b _ZZ15global_functioniE16local_static_var00000008 d _ZZ15global_functioniE21local_static_var_init U __gxx_personality_v000000000 B global_var00000000 D global_var_init0000003b T main00000036 T non_mangled_function
The differences between the outputs also show an example of solving thename mangling problem by usingextern "C" in C++ code.
| Symbol type | Description |
|---|---|
| A | Global absolute symbol |
| a | Local absolute symbol |
| B | Global bss symbol |
| b | Local bss symbol |
| D | Global data symbol |
| d | Local data symbol |
| f | Source file name symbol |
| R | Global read-only symbol |
| r | Local read-only symbol |
| T | Global text symbol |
| t | Local text symbol |
| U | Undefined symbol |
nm: write the name list of an object file – Shell and Utilities Reference,The Single UNIX Specification, Version 5 fromThe Open Groupnm(1) – Plan 9 Programmer's Manual, Volume 1