功能
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)
类型
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格式符号 |
? | 无法识别的符号 |