**nm**命令存在于多数后出版本的Unix及类似的操作系统中。nm被用来检查二进制文件（包括库，编译后的目标模块，共享目标文件，和独立可执行文件）并显示这些文件的内容，或存储在其中的元信息，特别是符号表。来自nm的输出区分各种符号类型。例如，在一个目标文件所提供的函数和它所需要的函数之间是有区别的。nm被用作调试的辅助工具，帮助解决名字冲突和C++名称修饰引起的问题，和验证工具链的其他部分。

GNU计划在GNU Binutils包中提供了一个nm的实现。`objdump -t`和`readelf -s`也可以查看目标文件的符号表。

nm输出样例
------

下面的例子展示了变量和函数在全局、局部、外部、静态、自动和初始化的不同情况下的不同符号类型。

```
/\*
 \* 文件名: test.c
 \* 对于C代码如下编译： 
 \* gcc -c test.c
 \*
 \* 对于C++代码如下编译：
 \* g++ -c test.cpp
 \*/

int global\_var;
int global\_var\_init = 26;

static int static\_var;
static int static\_var\_init = 25;

extern int extern\_var;
extern int extern\_function(int);

static int static\_function(int x, int y)
{
 int local\_automatic\_var;

 local\_automatic\_var = x + y;
 return local\_automatic\_var;
}

int global\_function(int p)
{
 static int local\_static\_var;
 static int local\_static\_var\_init=5;
 
 local\_static\_var = static\_function(local\_static\_var\_init, p); 
 return local\_static\_var;
}

int main(int argc, char\*\* argv)
{
 static\_var = 1;

 global\_var = global\_function(2);
 extern\_var = extern\_function(3);
 return 0;
}

#ifdef \_\_cplusplus
extern "C"
#endif
void non\_mangled\_function(void)
{
 // I do nothing
}

```

如果上述代码使用了gcc C编译器来编译，nm命令的输出将是如下这样：

```
$ nm test.o
 U extern\_function
 U extern\_var
000000000000001a T global\_function
 U \_GLOBAL\_OFFSET\_TABLE\_
0000000000000004 C global\_var
0000000000000000 D global\_var\_init
0000000000000004 b local\_static\_var.1970
0000000000000008 d local\_static\_var\_init.1971
000000000000004c T main
0000000000000045 T non\_mangled\_function
0000000000000000 t static\_function
0000000000000000 b static\_var
0000000000000004 d static\_var\_init

```

默认按符号字母序排序，其中，大写字母表示全局性，小写字母表示局部性；U表示此符号未定义，C表示此符号是公共的，T/t表示此符号在正文（代码）段中，D/d的表示此符号在初始化数据段中，B/b表示此符号在BSS数据段中。

在使用了C++编译器时，输出是不同的：

```
$ nm test.o
 U extern\_var
 U \_GLOBAL\_OFFSET\_TABLE\_
0000000000000000 B global\_var
0000000000000000 D global\_var\_init
000000000000004c T main
0000000000000045 T non\_mangled\_function
 U \_Z15extern\_functioni
000000000000001a T \_Z15global\_functioni
0000000000000004 b \_ZL10static\_var
0000000000000000 t \_ZL15static\_functionii
0000000000000004 d \_ZL15static\_var\_init
0000000000000008 b \_ZZ15global\_functioniE16local\_static\_var
0000000000000008 d \_ZZ15global\_functioniE21local\_static\_var\_init

```

在二者输出之间的不同还展示了通过在C++代码中使用extern "C"解决名称修饰问题的一个例子。

参见
--

* objdump
* readelf

外部链接
----

* `nm`: 写出一个目标文件的名字列表 – 命令与工具（Commands & Utilities）参考，单一UNIX®规范第7期，由國際開放標準組織发布




|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
Unix命令行程序和shell内建命令 |
| --- |
|  |
| 文件系統 | 
* cat
* cd
* chmod
* chown
* chgrp
* cksum
* cmp
* cp
* dd
* du
* df
* file
* fsck
* fuser
* ln
* ls
* mkdir
* mount
* mv
* pax（英语：）
* pwd
* rm
* rmdir
* size
* split
* stat
* tee
* touch
* type（英语：）
* umask（英语：）

 |
|  |
| 程序 | 
* at
* bg
* chroot
* cron
* fg
* kill
* killall（英语：）
* nice
* pgrep
* pkill（英语：）
* ps
* pstree（英语：）
* time
* top

 |
|  |
| 用户环境 | 
* clear
* env
* exit
* history（英语：）
* id
* logname
* mesg（英语：）
* passwd
* su
* sudo
* uptime
* talk（英语：）
* tput（英语：）
* uname
* w
* wall（英语：）
* who
* whoami
* write（英语：）

 |
|  |
| 文本编辑 | 
* awk
* banner（英语：）
* basename
* comm（英语：）
* csplit（英语：）
* cut
* diff
* dirname
* ed
* ex
* fmt（英语：）
* fold（英语：）
* head（英语：）
* iconv
* join（英语：）
* less
* more
* nl（英语：）
* paste（英语：）
* sed
* sort（英语：）
* spell（英语：）
* strings（英语：）
* tail
* tr
* uniq（英语：）
* vi
* wc
* xargs

 |
|  |
| 壳层内建 | 
* alias
* echo
* printf格式字符串
* test（英语：）
* unset
* wait

 |
|  |
| 网络 | 
* dig
* host
* ifconfig
* inetd（英语：）
* netcat
* netstat
* nslookup
* ping
* rdate（英语：）
* rlogin（英语：）
* route
* ssh
* traceroute

 |
|  |
| 查找 | 
* find
* grep
* locate
* whatis（英语：）
* whereis

 |
|  |
| 文档 | 
* apropos（英语：）
* help（英语：）
* man

 |
|  |
| 软件开发 | 
* ar
* ctags
* lex
* make
* nm
* strip
* yacc

 |
|  |
| 杂项 | 
* bc
* cal
* dc
* expr
* lp（英语：）
* lpr
* sleep
* true和false
* yes

 |
|  |
| Unix实用程序列表 |

 |