The output from nm distinguishes between various symbol types. For example, it differentiates between a function that is supplied by an object module and a function that is required by it. nm is used as an aid for debugging, to help resolve problems arising from name conflicts and C++ name mangling, and to validate other parts of the toolchain.
/* * 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 the gcc C compiler, the output of the nm command is the following:
# nmtest.o
0000000a 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.o
0000000a 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 the name mangling problem by using extern "C" in C++ code.