title: Nm (Unix)
text: # Nm (Unix)
  
  nm (name mangling) is a Unix command used to dump the symbol table and their attributes from a binary executable file (including libraries, compiled object modules, shared-object files, and standalone executables).
  
  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.
  
  This command is shipped with a number of later versions of Unix and similar operating systems including Plan 9. The GNU Project ships an implementation of nm as part of the GNU Binutils package.
  
  ## nm output sample
  
  If the previous code is compiled with the gcc C compiler, the output of the nm command is the following:
  
  When the C++ compiler is used, the output differs:
  
  The differences between the outputs also show an example of solving the name mangling problem by using extern "C" in C++ code.
  
  Symbol Types :
  
  | 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. |
  | L | Global thread-local symbol (TLS). |
  | l | Static thread-local symbol (TLS). |
  | R | Global read only symbol. |
  | r | Local read only symbol. |
  | T | Global text symbol. |
  | t | Local text symbol. |
  | U | Undefined symbol. |
  