linux nm命令

功能

nm是names的简称,通过该指令可以列举文件中的符号(一般是库文件),因为很多时候我们并不首要关注库逻辑实现,只需要知道某些函数或变量的命名冲突等问题,这个时候就可以使用nm命令,当然,类似的命令还有其他的,这里我只讲nm。

Usage: nm [option(s)] [file(s)]
 List symbols in [file(s)] (a.out by default).
 The options are:
  -a, --debug-syms       只显示调试信息
  -A, --print-file-name   在每行符号信息前,打印查询的文件名
  -C, --demangle[=STYLE] 将低级别的符号名称转换为用户级别的名称,意思是转换为用户较容易理解的形式
  -D, --dynamic          显示动态符号信息
  -f, --format=FORMAT    设置信息输出格式. 它可以是`bsd',`sysv' 或者 `posix'. 默认为 `bsd'
  -g, --extern-only      只显示外部符号;封装成动态库时,需要被外部调用的函数必须是外部符号,否则无法使用
  -l, --line-numbers     显示每个符号的文件名和行号
  -n, --numeric-sort     将符号按地址排序
  -r, --reverse-sort     反向排序
  -S, --print-size       显示定义符号的大小
  -u, --undefined-only   仅显示未定义符号
  -X 32_64               (ignored)

一般显示格式

值(the symbol value)、类型(the symbol type)、名字(the symbol name) 

linux nm命令

类型

nm 将找到的符号值使用十六进制缺省表示,并在函数前添加其类型,类型主要有:

描述
A 符号绝对,链接过程不允许被改变
B/b 非初始化符号,出现在bss段中
C 公有符号,链接时会被同名符号覆盖
D/d 初始化符号
G/g 初始化符号,面向小数据访问优化
I 其它符号的间接引用
N 调试符号
P 栈区符号(清空)
R/r 符号只读
S/s 非初始化符号,面向小数据访问优化
T/t 代码区符号
U 未定义或在外部定义的符号
u 全局唯一,GNU保留符
V/v 弱定义符(详见C++强弱符号定义)
W/w 弱符号,但是还没有被弱对象定义
- stabs格式符号
? 无法识别的符号