5.9. Binutils-2.31.1 - 第二遍

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

估计编译时间: 1.1 SBU
需要硬盘空间: 593 MB

5.9.1. 安装 Binutils

再一次地,创建一个单独的构建目录:

mkdir -v build
cd       build

准备安装 Binutils:

CC=$LFS_TGT-gcc                \
AR=$LFS_TGT-ar                 \
RANLIB=$LFS_TGT-ranlib         \
../configure                   \
    --prefix=/tools            \
    --disable-nls              \
    --disable-werror           \
    --with-lib-path=/tools/lib \
    --with-sysroot

配置选项的含义:

CC=$LFS_TGT-gcc AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib

这次编译 Binutils 是本地编译而不是交叉编译, 设置这些变量可以强制构建系统使用交叉编译器和相关工具, 而不是宿主系统的编译器和工具。

--with-lib-path=/tools/lib

这个选项使得配置脚本在编译 Binutils 时指定库文件搜索目录, 将 /tools/lib 传递给链接器。这保证链接器不会搜索宿主系统的库文件目录。

--with-sysroot

在链接时,某些共享对象可能要求其他共享对象,sysroot 特性允许链接器查找它们。如果不启用它,在某些宿主环境中, 一些软件包无法成功构建。

[注意]

译注

这个选项看上去很奇怪,而且解释不够清晰。 译者查资料得知, 从 Binutils 2.17 起,为保证和动态链接器的一致性, ld在搜索 DT_NEEDED 要求的共享对象时,先搜索 /etc/ld.so.conf 指定的目录, 再搜索配置时指定的默认目录。如果不启用 sysroot 功能, 且宿主系统使用了 /etc/ld.so.conf, 那么宿主环境中的共享对象会污染工具链, 进而导致一系列严重问题。 如果您不想使用这个看上去奇怪的选项,可以执行 touch /tools/etc/ld.so.conf 创建一个空的 ld.so.conf 文件, 覆盖宿主系统的设置。参阅 lfs-dev 列表中的讨论,以及 ld/2290。 另外 ld(1) 中关于这个搜索顺序的描述尚未更新。

编译该软件包:

make

安装该软件包:

make install

现在,为下一章的 重新调整 阶段准备链接器:

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

make 命令参数的含义:

-C ld clean

该选项告诉 make 程序移除 ld 子目录中所有编译得到的文件。

-C ld LIB_PATH=/usr/lib:/lib

该选项重新构建 ld 子目录中的一切。在命令行指定 LIB_PATH Makefile 变量,即可覆盖临时工具的默认值, 并将其指向正确的最终路径。 该变量的值指定链接器的默认库文件搜索路径, 这个准备好的链接器将在下一章使用。

该软件包的更多信息可以在 第 6.16.2 节 “Binutils 的内容” 中找到。