温馨提示×

linux中nm命令怎么用

小樊
32
2026-10-09 08:48:14
栏目: 智能运维

nm 是 Linux 下用于查看目标文件(.o)、静态库(.a)、共享库(.so)和可执行文件中符号表的命令,常用于调试、排查链接错误、查看函数/变量是否导出等。


一、基本用法

nm [选项] 文件

示例:

nm a.out
nm libfoo.a
nm libfoo.so

二、常见输出格式

默认输出类似:

00000000004005b6 T main
00000000004006a0 t helper
                 U printf

每列含义:

  1. 地址(未定义符号为空白)
  2. 符号类型(大写=全局,小写=局部)
  3. 符号名

三、常见符号类型说明

类型 含义
T / t 文本(代码)段符号
D / d 已初始化的全局变量
B / b 未初始化的全局变量(BSS)
U 未定义符号(需链接)
W / w 弱符号
C 未指定类型的普通符号

四、常用选项

1. 只显示外部(未定义)符号

nm -u a.out

常用于查看“缺哪个库”


2. 显示动态符号(用于 .so)

nm -D libfoo.so

3. 按地址排序

nm -n a.out

4. 只显示某类符号(如函数)

nm -t x a.out      # 十六进制
nm --defined-only  # 只显示已定义符号

5. C++ 符号 demangle

nm -C a.out

把 ._Z3fooi 变成 foo(int)


6. 查看静态库里有哪些目标文件

nm libfoo.a

五、实战示例

查看可执行文件是否定义了 main

nm a.out | grep main

查看某个函数是否导出

nm -D libfoo.so | grep foo

排查 undefined reference

nm -u main.o

然后找提供该符号的 .a 或 .so


六、和类似命令对比

命令 用途
nm 符号表
objdump -t 更详细符号
readelf -s ELF 符号(更底层)
ldd 查看动态依赖

如果你有具体场景(比如链接报错、查符号、分析库),我可以给你更针对性的用法。

0 踩