这个包的详细信息位于 第 6.9.4 节 “Glibc 的内容.”
Glibc 软件包包含主要的 C 库。这个库提供用于分配内存、搜索目录、开关读写文件、字符串处理、表达式匹配和算术等的基本途径。
在某些情况下,尤其是在 LFS 7.1 中,rpc 头文件并没有被正确安装。检测它们在宿主系统上是否已经安装,如果没有则安装它们:
if [ ! -r /usr/include/rpc/types.h ]; then su -c 'mkdir -pv /usr/include/rpc' su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc' fi
Glibc 文档建议在源代码目录外的一个专用目录中构建 Glibc:
mkdir -v ../glibc-build cd ../glibc-build
接下来,准备编译 Glibc:
../glibc-2.19/configure \ --prefix=/tools \ --host=$LFS_TGT \ --build=$(../glibc-2.19/scripts/config.guess) \ --disable-profile \ --enable-kernel=2.6.32 \ --with-headers=/tools/include \ libc_cv_forced_unwind=yes \ libc_cv_ctors_header=yes \ libc_cv_c_cleanup=yes
配置选项的含义:
--host=$LFS_TGT,
--build=$(../glibc-2.19/scripts/config.guess)
这几个选项的作用是让 Glibc 使用 /tools
中的编译器和链接器进行交叉编译。
--disable-profile
不使用检测信息进行构建。如果需要检测临时工具,则去掉这个选项。
--enable-kernel=2.6.32
这告诉 Glibc 提供 2.6.32 或更新内核的支持。比这个旧的内核将不会提供支持。
--with-headers=/tools/include
这告诉 Glibc 使用 tools 目录里新安装的头文件来编译自己,这样它能知道内核有什么特性,从而能优化自己。
libc_cv_forced_unwind=yes
第 5.4 节 “Binutils-2.24 - Pass 1” 中安装的链接器是被交叉编译的,因此直到 Glibc 被安装后才能使用。这意味着对 force-unwind 的支持的配置测试会失败,因为它依赖一个工作着的链接器。libc_cv_forced_unwind=yes 告诉 configure 对 force-unwind 是支持的,而不用去测试。
libc_cv_c_cleanup=yes
同样地,我们传递 libc_cv_c_cleanup=yes 给 configure 脚本以跳过测试,C 清理支持被设置好了。
libc_cv_ctors_header=yes
同样地,我们传递 libc_cv_ctors_header=yes 给 configure 脚本以跳过测试,gcc 构造函数支持被设置好了。Simlarly, we pass libc_cv_ctors_header=yes through to the configure script so that the test is skipped and gcc constructor support is configured.
在这步进行时,可能会有下面的警告:
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
这个丢失的或不兼容的 msgfmt 程序通常是无害的。这个 msgfmt 程序是 Gettext 包的一部分,宿主系统应该要提供。
编译软件包:
make
这个软件包的确有一个组件,然而它现在还不能运行,因为我们目前还没有 C++ 编译器。
测试组件的成功运行也需要 locale 数据。locale 数据提供系统的日期、时间和货币格式等信息,用于系统工具的输出。如果不在本章运行测试组件(像每个建议的那样),现在就不需要安装 locale。适当的 locale 会在下一章安装。如果还是要现在安装 Glibc locale 的话,用 第 6.9 节 “Glibc-2.19.”中的指令。
安装软件包:
make install
在这里,停下来并确保新工具链的基本功能 (编译和链接) 能正常工作很重要。要进行检查,运行以下命令:
echo 'main(){}' > dummy.c $LFS_TGT-gcc dummy.c readelf -l a.out | grep ': /tools'
如果一切工作正常,就不会出现错误,最后一条命令的输出会类似这样:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
注意,/tools/lib
,或 64 位机器的
/tools/lib64
会作为动态链接器的前缀出现。
如果输出不想上面那样或根本没有输出,那就是哪里错了。研究回溯前面步骤,找出问题并更正。在继续进行后面的之前,这个问题必须要解决掉。
一切正常之后,清理测试文件:
rm -v dummy.c a.out
下下节构建 Binutils 也会作为工具链是否被正常构建的附加检查。如果 Binutils 构建失败,就说明前面的 Binutils、GCC 或 Glibc 的安装出现了问题。
这个包的详细信息位于 第 6.9.4 节 “Glibc 的内容.”