2.2.4 构建二进制工具

Binutils包含各种用来操作二进制目标文件的工具,其中包括GNU汇编器as和链接器ld,处理静态库的工具ar和ranlib,系统程序员常用的objdump、readelf、nm、strings、stip等。

Binutils推荐使用单独的目录进行编译:

2.2.4 构建二进制工具 - 图1

下面介绍各个配置参数的意义。

❑—prefix=$CROSS_TOOL:通过参数—prefix指定安装脚本将编译好的二进制工具安装到保存交叉编译工具链的$CROSS_TOOL目录下。

❑—target=$TARGET:因为没有显示指定参数—host和—build,所以编译脚本将自动探测HOST和BUILD的值。对于笔者的机器来说,探测到的HOST和BUILD值相同,都为i686-pc-linux-gnu。在前面设置环境变量时,我们故意将环境变量TARGET的值设置i686-none-linux-gnu,与HOST自动探测的值不同,因此,编译脚本据此判断这是在构建交叉编译工具链,继而将指导宿主系统的工具链编译“运行在本机,但是最后编译链接的程序/库是运行在$TARGET上”的交叉二进制工具。

❑—with-sysroot=$SYSROOT:我们通过参数—with-sysroot告诉链接器,目标系统的根文件系统放置在$SYSROOT目录下,链接时到$SYSROOT目录下寻找相关的库。

配置完成后,使用如下命令编译并安装:

2.2.4 构建二进制工具 - 图2

Binutils将二进制工具安装在$CROSS_TOOL/bin目录下,这里不浪费篇幅一一列举各个工具的具体功能了,读者可以使用man进行查看。

除了安装二进制工具外,Binutils还安装了链接脚本,安装目录是:

2.2.4 构建二进制工具 - 图3

其中elf_i386.x用于IA32上ELF文件的链接,elf_i386.xbn、elf_i386.xc等分别对应ld使用不同的链接参数时使用的链接脚本,如果使用了"-N"参数,那么ld使用链接脚本elf_i386.xbn。

Binutils在$CROSS_TOOL/i686-none-linux-gnu/bin目录下也安装了一些二进制工具,这些是编译器内部使用的,我们不必关心,其实这个目录下的工具与$CROSS_TOOL/bin目录下的工具完全相同,只是名称不同而已。