工具链软件包括BINUTILS、GCC、GLIBC、GDB等。
BINUTILS是二进制程序处理工具,包括链接器、汇编器等目标程序处理的工具。
GCC(GNU Compiler Collection)是编译器。对于C/C++语言的完整支持,需要支持glibc库。
GLIBC是应用程序编程的函数库软件包,可以编译生成静态库和共享库。完整的GCC需要支持glibc。
GDB是调试工具,可以读取可执行程序中的符号表,对程序进行源码调试。
默认情况下,GNU编译器生成的目标文件格式为elf格式。
elf文件由若干段(section)组成。
C:.text(正文段)包含程序的指令代码
.data(数据段)包含固定的数据,如常量、字符串
.bss(未初始化数据段)未初始化变量、数组等。
C++:.fini(析构函数代码)
.init(构造函数代码)
链接生成的elf格式文件还不能直接下载到目标平台上执行,可通过objcopy工具生成最终二进制文件。
链接器的任务就是将多个目标文件的.text、.data、.bss等段连接在一起,而连接脚本告诉链接器从什么地址开始放置这些段。
1. Binutils
由汇编器(as)产生的目标代码(*.o)是不能直接在computer上运行的,它必须经过链接器(ld)的处理才能生成可执行代码。
#ld –s –o test test.o
2. add2line
将地址转换成文件名或行号对,以便调试程序
3. ar 从文件中创建、修改、扩展文件
4. gasp 汇编宏处理器
5. nm 从目标文件列举所有变量
6. objcopy 使用GNU BSD库
把目标文件的内容从一种文件格式复制到另一种格式的目标文件中。
7. objdump 显示目标文件信息
可发编译二进制文件,也可以对对象文件进行反汇编,并查看机器代码。
8. readelf 显示elf文件信息
9. ranlib 生成索引以加快对归档文件的访问,并将其保存到这个归档文件中。
10. size 列出目标模块或文件的代码尺寸。
11. strings 打印可打印的目标代码符号(至少4个字符)
12. strip 放弃所有符号连接,一般应用程序最终都要strip处理
13. C++filt 链接器ld通过该命令可过滤C++符号和JAVA符号,防止重载函数冲突。
14. gprof 显示程序调用段的各种数据