6.16. Binutils-2.32

Binutils 软件包包含一个链接器、一个汇编器、以及其它处理目标文件的工具。

大致构建用时: 7.4 SBU
所需磁盘空间: 5.1 GB

6.16.1. 安装 Binutils

通过一个简单测试验证在 chroot 环境下 PTY 工作正常:

expect -c "spawn ls"

这个命令应该输出以下内容:

spawn ls

假如输出包括下面的信息,那么表示没有为 PTY 操作设置好环境。在运行 Binutils 和 GCC 的测试套件之前需要解决这个问题:

The system has no more ptys.
Ask your system administrator to create more.

删除一项测试,以保证不会影响到测试的完成:

sed -i '/@\tincremental_copy/d' gold/testsuite/Makefile.in

Binutils 的文档建议在一个专用的编译目录中编译 Binutils:

mkdir -v build
cd       build

配置 Binutils 准备编译:

../configure --prefix=/usr       \
             --enable-gold       \
             --enable-ld=default \
             --enable-plugins    \
             --enable-shared     \
             --disable-werror    \
             --enable-64-bit-bfd \
             --with-system-zlib

配置参数的意义:

--enable-gold

构建 gold 链接器并将其安装为 ld.gold(紧挨着默认链接器)。

--enable-ld=default

构建原来的 bdf 链接器并将其安装为 ld(默认链接器)和 ld.bfd。

--enable-plugins

为链接器启用插件支持。

--enable-64-bit-bfd

启用 64 位支持(针对字宽较窄的主机)。64 位系统可能没什么必要,但也不会有什么坏处。

--with-system-zlib

使用安装的 zlib 库替代自带的版本构建。

编译软件包:

make tooldir=/usr

make 参数的含义:

tooldir=/usr

一般来说,tooldir (最终存放可执行文件的目录) 设置为 $(exec_prefix)/$(target_alias)。例如,x86_64 机器会把它扩展为 /usr/x86_64-unknown-linux-gnu。因为这是个自定制的系统,并不需要 /usr中的特定目标目录。如果系统用于交叉编译(例如,在 Intel 机器上编译能生成在 PowerPC 机器上运行的代码的软件包)会使用 $(exec_prefix)/$(target_alias)

[重要]

重要

本章节中的 Binutils 测试套件至关重要,任何情况下都不能跳过。

查看结果:

make -k check

PC 相关的 offset 测试和 debug_msg.sh 中的测试已知会在 LFS 环境中测试失败。

安装软件包:

make tooldir=/usr install

6.16.2. Binutils 内容

安装的程序: addr2line, ar, as, c++filt, dwp, elfedit, gprof, ld, ld.bfd, ld.gold, nm, objcopy, objdump, ranlib, readelf, size, strings, 和 strip
安装的库: libbfd.{a,so} 和 libopcodes.{a,so}
安装目录: /usr/lib/ldscripts

简要介绍

addr2line

转换程序地址为文件名称和行号;给定一个地址和可执行文件的名称,它使用可执行文件中的调试信息来判断与该地址关联的源文件以及行号。

ar

创建、更改以及抽取归档文件。

as

一个将 gcc 的输出汇编到目标文件的汇编器。

c++filt

链接器用来过滤 C++ 和 Java 符号以及防止重载函数冲突。

dwp

DWARF 打包实用程序

elfedit

更新 ELF 文件的 ELF 文件头。

gprof

显示调用关系图配置数据。

ld

一个将多个目标文件和归档文件合并为单一文件,重定位数据及绑定符号引用的链接器。

ld.gold

一个阉割版的 ld,仅支持 elf 对象文件格式

ld.bfd

ld 的硬链接。

nm

列出指定目标文件中出现的符号。

objcopy

转换某种类型的目标文件到另一种类型。

objdump

显示给定目标文件的信息,用选项可以控制显示特定信息;显示的信息对于使用编译工具的程序员非常有用。

ranlib

生成归档文件内容的索引并保存到归档文件;索引列出了所有归档文件成员——可重定位的目标文件定义的符号。

readelf

显示 ELF 类型的二进制文件的信息。

size

列出所给目标文件各部分大小和总的大小。

strings

对每个给定文件,输出不低于指定长度(默认是4)的可打印字符序列;对于目标文件,它默认只打印初始化和引导部分的字符串,而对于其它类型的文件扫描整个文件。

strip

从目标文件中去除符号。

libbfd

二进制文件描述库。

libopcodes

一个库用于处理操作码——「可读文本」版的处理器指令;用于构建类似 objdump 的工具。