Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Nm (Unix)
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{short description|Unix command}} {{lowercase|nm (Unix)}} {{Infobox software | name = nm | logo = | screenshot = | screenshot size = | caption = | author = [[Dennis Ritchie]],<br />[[Ken Thompson]]<br />([[AT&T Bell Laboratories]]) | developer = Various [[open-source software|open-source]] and [[commercial software|commercial]] developers | released = {{Start date and age|1971|11|3}} | latest release version = | latest release date = | programming language = [[C (programming language)|C]] | operating system = [[Unix]], [[Unix-like]], [[Plan 9 from Bell Labs|Plan 9]] | platform = [[Cross-platform]] | genre = [[Command (computing)|Command]] | license = Plan 9: [[MIT License]] | website = }} <code>'''nm'''</code> is a [[Unix]] command used to dump the [[symbol table]] and their attributes from a [[binary file|binary]] [[executable]] file (including [[Library (computing)|libraries]], compiled [[Object file|object modules]], shared-object files, and standalone [[executable]]s). The output from <code>nm</code> distinguishes between various symbol types. For example, it differentiates between a [[subroutine|function]] that is supplied by an object module and a function that is required by it. <code>nm</code> 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 [[Unix-like|similar]] [[operating system]]s including [[Plan 9 from Bell Labs|Plan 9]]. The [[GNU Project]] ships an implementation of <code>nm</code> as part of the [[GNU Binutils]] package. The etymology is that in the old Version 7 Unix, <code>nm</code>'s manpage used the term ''name list'' instead of ''symbol table''.<ref>{{Cite web |title=NM(1) |url=https://man.freebsd.org/cgi/man.cgi?query=nm&manpath=Unix%20Seventh%20Edition&format=ascii |access-date=2025-03-14 |website=Unix Seventh Edition General Commands Manual}}</ref> ==nm output sample== <syntaxhighlight lang="c"> /* * 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; } </syntaxhighlight> If the previous code is compiled with the [[GNU Compiler Collection|gcc]] C compiler, the output of the <code>nm</code> command is the following: <syntaxhighlight lang="console"> # 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 </syntaxhighlight> When the C++ compiler is used, the output differs: <syntaxhighlight lang="console"> # 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 </syntaxhighlight> The differences between the outputs also show an example of solving the [[name mangling]] problem by using [[extern "C"]] in C++ code. {| class="wikitable" |+ 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 |- | R | Global read-only symbol |- | r | Local read-only symbol |- | T | Global text symbol |- | t | Local text symbol |- | U | Undefined symbol |} ==See also== *[[objdump]] == References == {{Reflist}} ==External links== {{Wikibooks|Guide to Unix|Commands}} *{{man|cu|nm|SUS|write the name list of an object file}} *{{man|1|nm|Plan 9}} {{Unix commands}} {{Plan 9 commands}} [[Category:Unix programming tools]] [[Category:Unix SUS2008 utilities]] [[Category:Articles with example C code]] [[Category:Plan 9 commands]] {{unix-stub}}
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)
Pages transcluded onto the current version of this page
(
help
)
:
Template:Cite web
(
edit
)
Template:Infobox
(
edit
)
Template:Infobox software
(
edit
)
Template:Lowercase
(
edit
)
Template:Main other
(
edit
)
Template:Man
(
edit
)
Template:Plan 9 commands
(
edit
)
Template:Reflist
(
edit
)
Template:Short description
(
edit
)
Template:Sister project
(
edit
)
Template:Template other
(
edit
)
Template:Unix-stub
(
edit
)
Template:Unix commands
(
edit
)
Template:Wikibooks
(
edit
)