8.18. Binutils-2.40

Binutils 包含汇编器、链接器以及其他用于处理目标文件的工具。

估计构建时间: 2.2 SBU
需要硬盘空间: 2.6 GB

8.18.1. 安装 Binutils

进行简单测试,确认伪终端 (PTY) 在 chroot 环境中能正常工作:

expect -c "spawn ls"

该命令应该输出:

spawn ls

如果输出不是上面这样,而是下面的消息,就说明环境没有为 PTY 的正常工作设置好。在运行 Binutils 和 GCC 的测试套件前必须解决这个问题。

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

Binutils 文档推荐创建一个新的目录,以在其中构建 Binutils:

mkdir -v build
cd       build

准备编译 Binutils:

../configure --prefix=/usr       \
             --sysconfdir=/etc   \
             --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

构建传统的 bfd 链接器,并且将它安装为 ld (默认链接器) 和 ld.bfd。

--enable-plugins

启用链接器插件支持。

--enable-64-bit-bfd

(在字长较小的宿主平台上) 启用 64 位支持。在 64 位平台上可能不需要,但无害。

--with-system-zlib

使用安装好的 zlib 库,而不是构建附带的版本。

编译该软件包:

make tooldir=/usr

make 命令参数的含义:

tooldir=/usr

一般来说,工具目录 (最终存放该软件包中可执行文件的目录) 被设定为 $(exec_prefix)/$(target_alias)。例如,在 x86_64 机器上,它将展开为 /usr/x86_64-pc-linux-gnu。因为 LFS 是定制系统,不需要 /usr 中的特定目标工具目录。如果系统用于交叉编译 (例如,在 Intel 机器上编译软件包,生成可以在 PowerPC 机器上执行的代码),就会使用 $(exec_prefix)/$(target_alias) 目录。

[重要]

重要

本节中,Binutils 的测试套件被认为是十分关键的,在任何情况下都不能跳过。

测试编译结果:

make -k check

如果需要列出所有失败的测试,执行:

grep '^FAIL:' $(find -name '*.log')

Gold 测试套件中,有十二项测试在构建 GCC 时启用 --enable-default-pie--enable-default-ssp 的情况下会失败。

安装该软件包:

make tooldir=/usr install

删除无用的静态库以及一个空的 man 页面:

rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,sframe,opcodes}.a
rm -fv /usr/share/man/man1/{gprofng,gp-*}.1

8.18.2. Binutils 的内容

安装的程序: addr2line, ar, as, c++filt, dwp, elfedit, gprof, gprofng, ld, ld.bfd, ld.gold, nm, objcopy, objdump, ranlib, readelf, size, strings, 以及 strip
安装的库: libbfd.so, libctf.so, libctf-nobfd.so, libopcodes.so, 以及 libsframe.so
安装的目录: /usr/lib/ldscripts

简要描述

addr2line

将程序中的地址翻译成文件名和行号;给定一个内存地址以及可执行程序的名字,该程序使用可执行文件中的调试信息,确定与该地址相关的源代码文件和行号

ar

创建、修改、提取档案文件

as

一个能够汇编 gcc 输出的汇编代码并生成目标文件的汇编器

c++filt

被链接器用于 demangle C++ 和 Java 符号,防止重载函数冲突

dwp

DWARF 封装工具

elfedit

更改 ELF 文件的 ELF 头

gprof

显示函数调用图性能分析数据

gprofng

收集和分析性能数据

ld

一个链接器,将一些目标文件和档案文件组合为一个单独的文件,重定位它们的数据,并绑定符号引用

ld.gold

ld 的一个裁减版,只支持 ELF 目标文件格式

ld.bfd

一个指向 ld.bfd 的硬链接

nm

列出给定目标文件中的符号

objcopy

将一种目标文件翻译成另一种

objdump

显示给定目标文件的信息,通过命令行选项指定要显示哪些信息;这些信息对开发编译工具的程序员很有用

ranlib

生成档案文件内容的索引,并将索引存入档案文件;索引列出档案文件中所有可重定位目标文件定义的符号

readelf

显示 ELF 格式二进制文件的信息

size

列出给定文件各个段的大小和文件总大小

strings

对于每个给定文件,输出其中长度不小于给定长度 (默认是 4) 的可打印字符序列;对于目标文件,它默认只输出可加载的已初始化数据段中的字符串,对于其他文件,它扫描整个文件

strip

移除目标文件中的符号

libbfd

二进制文件描述符库

libctf

紧凑 ANSI-C 类型格式调试支持库

libctf-nobfd

libctf 的变体,它不需要 libbfd 的功能

libopcodes

一个用于处理操作码 —— 处理器指令的 可读文本版本的库;它被 objdump 等构建工具所使用

libsframe

使用简单的栈展开器支持在线栈回溯的库