1. GNU介绍
工具链典型的例子就是GNU工具链。
GNU工具链是由GNU项目产生的各种编程工具的集合,用于开发应用程序与操作系统。
GNU工具链在针对嵌入式系统的Linux内核、BSD及其它软件的开发中起着至关重要的作用。
GNU工具链中的部分工具也被Mac OS X, Microsoft Windows等其它平台进行了移植使用。
GNU工具链中包含的项目有:
GNU make:用于编译和构建的自动工具。
GNU编译器集合(GCC):一组多种编程语言的编译器。
GNU Binutils:包含链接器ld、汇编器as和其它工具的工具集。
GNU Debugger(GDB):代码调试工具。
GNU构建系统(autotools):Autoconf、Autoheader、Automake、Libtool。
2. binutils工具集—GNU binutils工具集简介
GNU binutils是一个二进制工具集,主要包括:
ld,GNU链接器。
as,GNU汇编器。
addr2line,把地址转化为文件名和行号。
nm,列出目标文件的符号列表。
objdump,显示目标文件信息。
readelf,显示elf格式的文件信息。
objcopy,拷贝部分section以生成新的可执行文件,如elf->hex、elf->bin等。
ar,创建、修改、解压一个静态库文件。
size,显示目标文件的节大小。
strings,从目标文件中列出可打印的字符串。
c++filt,过滤c++符号为可识别的c符号。
ranlib,生成库文件中的.o文件索引。
strip,丢弃程序文件中的符号信息。
2.1 binutils工具集—objdump的用法
objdump主要用来显示目标文件的内容。
这里的显示,是指将二进制的文件内容反汇编形成汇编代码,因此“显示”约等同于“反汇编”。
使用objdump工具反汇编的原因:
(1)逆向破解。将可执行程序反汇编得到汇编代码,再根据汇编代码推理出整个程序的逻辑。这个不是一般人能做的,能看懂大量汇编语言写的程序都很困难了,更别说反推别人的代码逻辑。
(2)调试程序。反汇编调试可以帮助我们理解并检测生成的可执行程序是否正常,尤其是在理解链接脚本和链接地址等概念时。
(3)C语言的源代码编译链接生成的可执行文件再反汇编,可以帮助我们理解C语言和汇编语言的对应关系,有助于深入理解C语言。
通过man手册,可知该工具的使用格式如下。
objdump [options] obj_file #[]表示可选,obj_file表示目标文件
objdump工具支持很多选项,这里仅列出一些常用的选项。
2.2 5.4.binutils工具集—objcopy的用法
objcopy主要用来转换目标文件的格式。
在实际开发中,我们会用该工具进行格式转换与内容删除。
(1)在链接完成后,将elf格式的.out文件转化为bin格式的文件。
#复制:将可执行程序test_adr.elf从一种二进制格式(elf)转换成另外一种二进制格式(bin)
arm-linux-objcopy -O binary -S test_adr.elf test_adr.bin
(2)(通过-g、-S等选项)删除文件正常运行时不需要的内容,比如符号表、重定位表、调试信息等。裁剪后其体积比原来小很多,可以节省flash资源。当flash空间不足时,我们可以先查看文件中是否存在运行时非必需的内容,并利用objcopy工具删除。
arm-linux-objcopy -g -S -O elf32-littlearm test_adr.elf test_adr2.elf
#或者写成
arm-linux-objcopy -g -S test_adr.elf -O elf32-littlearm test_adr2.elf
通过man手册,可知该工具使用格式如下。
objcopy [options] infile [outfile] #[]表示该项是可选的