5.7. Glibc-2.19

Glibc 软件包包含主要的 C 库。这个库提供用于分配内存、搜索目录、开关读写文件、字符串处理、表达式匹配和算术等的基本途径。

预计构建时间: 4.7 SBU
磁盘空间需求: 567 MB

5.7.1. 安装 Glibc

在某些情况下,尤其是在 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 的内容.”