二进制工具集简析
作者:苗老师,华清远见嵌入式学院讲师。
1、addr2line能够把程序地址转换为文件名和行号,前提是这个可执行文件包括调试符号
1 #include <stdio.h>
2
3 void foo()
4 {
5 printf("The address of foo() is %p\n",foo);
6 }
7 int main()
8 {
9 foo();
10 return 0;
11 }
运行如下命令,得到:
现在,我们可以用这一地址来看看addr2line是如何使用的。在终端中运行如下命令,从命令的运行结果可以看出,addr2line工具正确指出了0x80483c4所对应的程序的具体位置以及所对应的函数名。在调用 addr2line 工具时,要使用 -e 选项来指定可执行映像是 test。通过使用 -f 选项,可以告诉工具输出函数名。
2、nm可以列出目标文件中的符号。用法虽然简单,但是功能很强大。符号是指函数名或变量。
nm所列出的每一行有三部分组成:第一列是指程序运行时的符号所对应的地址,对于函数则地址表示的是函数的开始地址,对于变量则表示变量的存储地址;第二列是指对应符号放在哪一个段;而最后一列则是指符号的名称。在前面我们讲解addr2line时,我们提到addr2line是将程序地址转换成这一地址所对应的具体函数是什么,而nm则是全面的列出这些信息。但是,nm不具备列出符号所在源文件及其行号这一功能,因此,我们说每一个工具有其特定功能。