5.7. Glibc-2.21

Glibc 软件包包括主要的 C 库。这个库提供了基本的内存分配、文件夹搜素、读写文件、字符串处理、模式匹配、算术等等例程。

大概编译时间: 3.9 SBU
所需磁盘空间: 670 MB

5.7.1. 安装 Glibc

在某些情况下,尤其是 LFS 7.1,rpc(译者注: Remote Procedure Calling, 远程过程调用)头文件并没有正确安装。测试查看是否安装在了主机系统中,如果没有的话安装它:

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

修复软件包中一个会影响 32 位架构的回滚:

sed -e '/ia32/s/^/1:/' \
    -e '/SSE2/s/^1://' \
    -i  sysdeps/i386/i686/multiarch/mempcpy_chk.S

Glibc 手册建议在源文件夹之外的一个专用文件夹中编译 Glibc:

mkdir -v ../glibc-build
cd ../glibc-build

下一步,准备编译 Glibc:

../glibc-2.21/configure                             \
      --prefix=/tools                               \
      --host=$LFS_TGT                               \
      --build=$(../glibc-2.21/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.21/scripts/config.guess)

这些选项的组合效果是 Glibc 的构建系统配置它自己用 /tools 里面的交叉链接器和交叉编译器交叉编译自己。

--disable-profile

编译库但不包含分析信息。如果临时工具需要分析信息则忽略此选项。

--enable-kernel=2.6.32

这告诉 Glibc 编译能支持 Linux 2.6.32 以及之后的内核库。更早的内核版本不受支持。

--with-headers=/tools/include

告诉 Glibc 利用刚刚安装在 tools 文件夹中的头文件编译自身,此能够根据内核的具体特性提供更好的优化。

libc_cv_forced_unwind=yes

5.4,“Binutils-2.25 - 第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 构建器支持的配置。

在这个过程中,可能会出现下面的警告:

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 软件包的一部分,主机发行版应该提供了。

[Note]

注意

有报告说用 "parallel make" 编译这个软件包的时候会失败。如果出现这种情况,用 "-j1" 选项重新运行 make 命令。

编译软件包:

make

安装软件包:

make install
[Caution]

警告

到了这里,必须停下来确认新工具链的基本功能(编译和链接)都是像预期的那样正常工作。运行下面的命令进行全面的检查:

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
[Note]

注意

在后面的编译 Binutils 章节时会再一次检查工具链是否正确编译。如果 Binutils 编译失败,说明之前安装 Binutils、GCC、或者 Glibc 时某些地方出现了错误。

该软件包的详细信息在 6.9.4, “Glibc 软件包内容”