【nm】nm命令的使用:查看.so中的符号信息
文章目录
- 1. 基本语法与常用选项
- 2. 符号类型
- 3. 使用示例
- 查看特定符号是否存在
- 显示未定义符号(用于依赖检查)
- 查找所有函数符号
- 检查符号冲突
- 查找符号来源文件(需要调试信息)
nm:Name Mangling命令是GNU Binutils工具集的一部分,用于显示.o,.so,可执行文件等中的符号表信息。
1. 基本语法与常用选项
nm [选项] <文件>
# 常用选项
-a : 显示所有符号,包括调试符号
-g : 仅显示外部(全局)符号
-u : 仅显示未定义符号(需要外部提供)
-D : 显示动态符号(用于共享库)
-C : 反解析C++符号
--defined-only : 仅显示已定义的符号
--no-demangle : 禁用C++符号反解析
-l : 显示符号对应的源代码行号(需要调试信息)
-S : 显示符号大小,如数据对象大小
--size-sort : 按符号大小排序
--numeric-sort : 按符号地址排序
--no-strip-undefined : 保留所有符号,有的符号可能被优化掉
2. 符号类型
nm命令回显的第二列表示符号类型:
A : 绝对地址,不可更改
B : BSS段,未初始化数据
D : 数据段,初始化数据
T : 代码段,函数或可执行代码
U : 未定义符号,需要外部提供
W : 弱符号,可被覆盖
V : 弱对象符号
I : 间接引用
小写字母 : 表示局部符号,比如 t 就表示局部函数
3. 使用示例
查看特定符号是否存在
nm -gC --defined-only libexample.so | grep -w 'symbol_name'
显示未定义符号(用于依赖检查)
nm -u myapp
查找所有函数符号
nm -gC libexample.so | grep ' T '
检查符号冲突
nm -gC libmerged.a | awk '{print $3}' | sort | uniq -d
查找符号来源文件(需要调试信息)
nm -l libdebug.so | grep my_function