该软件包的更多信息可以在 第 6.16.2 节 “Binutils 的内容” 中找到。
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 的内容” 中找到。