Linux系统下列出库文件中的符号指令(nm)

1 nm指令

nm是names的缩写, nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等)。

nm命令的输出包含三个部分:
1 符号值。默认显示十六进制,也可以指定;
2 符号类型。小写表示是本地符号,大写表示全局符号(external);
3 符号名称

2 符号类型的含义

A: 符号值是绝对的。在进一步的连接中,不会被改变。
B: 符号位于未初始化数据段(known as BSS).
C: 共用(common)符号. 共用符号是未初始化的数据。在连接时,多个共用符号可能采用一个同样的名字,如果这个符号在某个地方被定义,共用符号被认为是未定义的引用.
D: 已初始化数据段的符号
G: 已初始化数据段中的小目标(small objective)符号. 一些目标文件格式允许更有效的访问小目标数据,比如一个全局的int变量相对于一个大的全局数组。
I: 其他符号的直接应用,这是GNU扩展的,很少用了.
N: 调试符号.
R: 只读数据段符号.
S: 未初始化数据段中的小目标(small object)符号.
T: 代码段的符号.
U: 未定义符号.
V: 弱对象(weak object)符号. 当一个已定义的弱符号被连接到一个普通定义符号,普通定义符号可以正常使用,当一个未定义的弱对象被连接到一个未定义的符号,弱符号的值为0.
W: 一个没有被指定一个弱对象符号的弱符号(weak symbol)。
-: a.out目标文件中的刺符号(stabs symbol). 这种情况下,打印的下一个值是其他字段,描述字段,和类型。刺符号用于保留调试信息.
?: 未知符号类型,或者目标文件特有的符号类型.

3 简单示例

nm nm_test.so

运行结果如下:
在这里插入图片描述
nm_test.so的源码如下:

#include <stdio.h>
 
int add(int x, int y)
{
	return x + y;
}
 
int global_a;
int global_b = 1;
char szTest[] = "Hello";
 
int main()
{
	int part_c = 2;
	return 0;
}

从运行结果图中可以看出, 有add函数, 有全局变量global_a, global_b和szTest, 要注意, global_a是未初始化的, 所以在Bss段, 而global_b、szTest是初始化了的, 所以在Data段。 值得注意的是, 并没有global_c, 因为global_c是局部变量, nm看不到的。
在上面看不到"Hello", 因为nm是用来看szTest而非"Hello"的。 如果想要看字符串"Hello",可以使用前面提到的strings命令。

nm指令详细介绍

nm是Linux下的一个命令行工具,用于显示目标文件(可执行文件、共享库)中的符号表。下面详细介绍nm指令的功能和用法。

1、命令格式:
nm [选项] <目标文件>

2、功能描述:
nm命令用于查看目标文件中定义和引用的符号信息。它可以列出目标文件中包含的全局符号、静态符号和外部符号,以及这些符号的地址、类型等相关信息。通过nm命令可以了解程序中使用的函数、变量以及其他符号的定义和引用情况。

3、常用选项:
-A, --with-all:显示所有符号,包括局部符号和模板实例化。
-a, --debug-syms:显示调试符号。
-B, --format=bsd:以BSD风格显示符号。
-C, --demangle:对C++符号进行解码。
-D, --dynamic:仅显示动态符号。
-h, --print-header:显示目标文件的文件头信息。
-l, --line-numbers:显示与行号相关的调试信息。
-o FILE, --output-file=FILE:将结果输出到文件。
-P, --portability:以可移植性方式显示符号。
-S, --print-size:显示符号的大小。
–size-sort:按照大小对符号进行排序。
–version:显示版本信息。

4、使用示例:
(1) 显示目标文件中的符号表:
nm /path/to/object_file

(2) 以可读方式显示符号信息:
nm -C /path/to/object_file

(3) 只显示全局符号和外部符号:
nm -g /path/to/object_file

(4) 显示符号的大小及行号信息:
nm -S -l /path/to/object_file

(5) 将结果输出到文件:
nm -o output.txt /path/to/object_file

5、输出解读:
nm命令的输出通常包括以下列:
符号地址:对于可执行文件或共享库,通常是相对于基址而言的偏移量。
类型:表示符号的类型,如函数、数据、未定义等。
符号名称:符号的名称,可以是函数名、变量名等。
外部引用:表示是否是外部引用的符号。
版本绑定:显示与符号绑定的版本信息。

符号列表按照默认的字母顺序排列。在调试和分析程序时,可以通过nm命令查看函数、全局变量等符号的相关信息,从而帮助理解程序的结构、依赖关系和潜在问题。

使用nm命令可以快速查看目标文件中的符号信息,在二进制文件分析、代码分析和性能优化等场景中非常有用。掌握nm命令可以帮助开发人员更好地了解程序的内部结构和运行机制,提高代码质量和性能优化水平。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘凉~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值