nm 是 Linux 下用于查看目标文件(.o)、静态库(.a)、共享库(.so)和可执行文件中符号表的命令,常用于调试、排查链接错误、查看函数/变量是否导出等。
nm [选项] 文件
示例:
nm a.out
nm libfoo.a
nm libfoo.so
默认输出类似:
00000000004005b6 T main
00000000004006a0 t helper
U printf
每列含义:
| 类型 | 含义 |
|---|---|
| T / t | 文本(代码)段符号 |
| D / d | 已初始化的全局变量 |
| B / b | 未初始化的全局变量(BSS) |
| U | 未定义符号(需链接) |
| W / w | 弱符号 |
| C | 未指定类型的普通符号 |
nm -u a.out
常用于查看“缺哪个库”
nm -D libfoo.so
nm -n a.out
nm -t x a.out # 十六进制
nm --defined-only # 只显示已定义符号
nm -C a.out
把 ._Z3fooi 变成 foo(int)
nm libfoo.a
nm a.out | grep main
nm -D libfoo.so | grep foo
nm -u main.o
然后找提供该符号的 .a 或 .so
| 命令 | 用途 |
|---|---|
| nm | 符号表 |
| objdump -t | 更详细符号 |
| readelf -s | ELF 符号(更底层) |
| ldd | 查看动态依赖 |
如果你有具体场景(比如链接报错、查符号、分析库),我可以给你更针对性的用法。