在binutils工具集中,以下工具是我们在做嵌入式软件开发时需要掌握的:
as是汇编编译器,用于将汇编代码转换为目标文件。
add2line用户得到程序指令地址所对应的函数,以及函数所在的源文件名和函号;
ar用于创建和修改档案文件,以及从档案文件中抽取文件。静态库(.a文件)就是一种档案文件,需要用它生成和管理;
ld:链接器;
nm:用于列出程序文件中的符号及符号在内存中的(开始)地址;符号包含C程序中的函数名和变量名;
objcopy:用于用来从程序文件中拷贝出我们所指定的段。代码格式转换。
objdump:能显示程序文件的相关信息和对程序文件进行反汇编;
ranlib:用于生成一个档案文件的内容索引,以加快对档案文件的查找速度。将该工具运用于静态库能提高库参与链接的效率。
size:用于了解程序文件中各段的大小。
strings:用于查看程序文件内的可显示字符串。
strip:用于剥去程序文件的调试信息,以减少文件所占用的存储空间。
以下是他们具体的用法:
1、addr2line [地址] -f -e [应用程序名]
2、ar:静态库生成器
ar的参数:
c:表示创建一个档案文件;
r:指示将文件增加到所创建的库文件中;
s:为了生成库索引以提高库被链接时的效率。
3、nm符号显示器
总体来说,nm用于列出程序文件中的符号。nm所列出的每一行由三个部分组成。
第一列:是指程序运行时符号在内存中的地址。它表示函数或变量的开始地址;
第二列:是指相应的符号存放在哪一个段;
第三列:是符号的名称;
针对第二列:
A:表示符号所对应的值时绝对的且在以后的连接过程中也不会改变;
B或b:表示符号位于未初始化的数据段中;
C:表示没有被初始化的公共符号;
D或者d:表示符号位于初始化的数据段(.data段)中。
N:表示符号是没有调试用的。
p:表示符号位于一个栈回溯段中。
R或者r:表示符号位于只读数据段(.rdata段)中 。
T 或者t:表示符号位于代码段(.text段)中。
U:表示符号没有被定义。
4、objdump -h hello
5、objcopy
6、ranlib库索引生成器: nm -s libmy.a
7、size
8、strings 字符串窥视器 : strings hello
9、strip 程序文件瘦身器。
参考文献:专业嵌入式软件开发 李云。