Glibc 软件包包含了主要的 C 库。这个库提供了用于分配内存、搜索目录、打开和关闭文件、读取和写入文件、字符串处理、模式匹配、算术运算等等的基本例程。
一些 LFS 之外的软件包建议安装 GNU libiconv,以便将数据从一种编码转换为另一种编码。该项目的主页 (https://gnu.ac.cn/software/libiconv/) 上说:“这个库提供了一个 iconv() 实现,用于那些没有该实现的系统,或者其实现无法从/向 Unicode 转换的系统。 ” Glibc 提供了一个iconv()实现,并且可以从/向 Unicode 转换,因此在 LFS 系统上不需要 libiconv。
已知此软件包在其默认优化标志(包括 -march 和 -mcpu 选项)被更改时会出现问题。如果定义了任何覆盖默认优化的环境变量,例如CFLAGS和CXXFLAGS,在构建 Glibc 时取消设置它们。
Glibc 构建系统是自包含的,即使编译器 specs 文件和链接器仍然指向/tools,它也可以完美地安装。在安装 Glibc 之前无法调整 specs 和链接器,因为 Glibc autoconf 测试会给出错误的结果,并破坏实现干净构建的目标。
linuxthreads tarball 包含了由 Glibc 安装的线程库的 man 页面。从 Glibc 源码目录中解压 tarball
tar -xjvf ../glibc-linuxthreads-2.3.4.tar.bz2
在某些罕见的情况下,当没有标准搜索目录存在时,Glibc 可能会发生段错误。以下补丁可以防止这种情况
patch -Np1 -i ../glibc-2.3.4-rtld_search_dirs-1.patch
当运行内核为 2.6.11.x 时,Glibc 有两个测试会失败。问题已被确定出在测试本身,而不是 libc 或内核。此补丁修复了该问题
patch -Np1 -i ../glibc-2.3.4-fix_test-1.patch
应用以下补丁以修复 Glibc 中的一个错误,该错误可能会阻止某些程序(包括 OpenOffice.org)运行
patch -Np1 -i ../glibc-2.3.4-tls_assert-1.patch
Glibc 文档建议在源码目录之外的专用构建目录中构建 Glibc
mkdir -v ../glibc-build cd ../glibc-build
准备编译 Glibc
../glibc-2.3.4/configure --prefix=/usr \ --disable-profile --enable-add-ons \ --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
新的 configure 选项的含义
这会将 pt_chown 程序的默认位置从/usr/libexec更改为/usr/lib/glibc.
编译软件包
make
在本节中,Glibc 的测试套件被认为是至关重要的。在任何情况下都不要跳过它。
测试结果
make -k check >glibc-check-log 2>&1 grep Error glibc-check-log
Glibc 测试套件高度依赖于主机系统的某些功能,特别是内核。一般来说,Glibc 测试套件总是应该通过的。但是,在某些情况下,一些失败是不可避免的。以下是最常见问题的列表
当在 CPU 不是相对较新的正品 Intel 或 authentic AMD 的系统上运行时,math 测试有时会失败。某些优化设置也被认为是这里的因素。
gettext 测试有时会由于主机系统问题而失败。确切原因尚不清楚。
如果您使用 noatime 选项挂载了 LFS 分区,则 atime 测试将失败。正如 第 2.4 节 “挂载新分区” 中提到的,在构建 LFS 时不要使用 noatime 选项。
当在较旧和较慢的硬件上运行时,由于测试超时,某些测试可能会失败。
尽管这是一个无害的消息,但 Glibc 的安装阶段会抱怨缺少/etc/ld.so.conf。使用以下命令阻止此警告
touch /etc/ld.so.conf
安装软件包
make install
使系统以不同语言响应的语言环境未通过上述命令安装。使用以下命令安装它
make localedata/install-locales
为了节省时间,运行前一个命令(它会生成并安装 glibc-2.3.4/localedata/SUPPORTED 文件中列出的每个语言环境)的替代方法是仅安装那些需要和想要的语言环境。这可以通过使用 localedef 命令来实现。有关此命令的信息位于 Glibc 源码的INSTALL文件中。但是,为了使未来软件包的测试能够通过,特别是 GCC 中的 libstdc++ 测试,有许多语言环境是必不可少的。以下说明,而不是上面使用的 install-locales 目标,将安装成功运行测试所需的最小语言环境集
mkdir -pv /usr/lib/locale localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i it_IT -f ISO-8859-1 it_IT localedef -i ja_JP -f EUC-JP ja_JP
由上面的 make localedata/install-locales 命令安装的一些语言环境,无法被 LFS 和 BLFS 书籍中的某些应用程序正确支持。由于应用程序员做出假设,在这些语言环境中会发生各种问题,LFS 不应在利用多字节字符集(包括 UTF-8)或从右到左书写顺序的语言环境中使用。需要许多非官方和不稳定的补丁来修复这些问题,LFS 开发人员已决定目前不支持如此复杂的语言环境。这也适用于 ja_JP 和 fa_IR 语言环境——它们仅为了使 GCC 和 Gettext 测试通过而安装,并且 watch 程序(Procps 软件包的一部分)在这些语言环境中无法正常工作。在与国际化相关的提示中记录了试图规避这些限制的各种尝试。
构建 linuxthreads man 页面,它是关于线程 API(也适用于 NPTL)的很好的参考
make -C ../glibc-2.3.4/linuxthreads/man
安装这些页面
make -C ../glibc-2.3.4/linuxthreads/man install
需要创建/etc/nsswitch.conf文件,因为尽管 Glibc 在此文件丢失或损坏时提供默认值,但 Glibc 默认值在网络环境中无法很好地工作。还需要配置时区。
创建一个新文件/etc/nsswitch.conf通过运行以下命令
cat > /etc/nsswitch.conf << "EOF" # Begin /etc/nsswitch.conf passwd: files group: files shadow: files hosts: files dns networks: files protocols: files services: files ethers: files rpc: files # End /etc/nsswitch.conf EOF
要确定本地时区,请运行以下脚本
tzselect
在回答几个关于位置的问题后,脚本将输出时区的名称(例如,EST5EDT 或 Canada/Eastern)。然后创建/etc/localtime文件,通过运行
cp -v --remove-destination /usr/share/zoneinfo/[xxx] \ /etc/localtime
将 [xxx] 替换为 tzselect 提供的时区名称 (例如, Canada/Eastern)。
cp 选项的含义
这是强制删除已存在的符号链接所必需的。复制文件而不是使用符号链接的原因是为了涵盖/usr位于单独分区的情况。当启动到单用户模式时,这可能很重要。
默认情况下,动态加载器(/lib/ld-linux.so.2)搜索/lib和/usr/lib以查找程序运行时所需的动态库。但是,如果库位于/lib和/usr/lib以外的目录中,则需要将这些目录添加到/etc/ld.so.conf文件中,以便动态加载器可以找到它们。通常已知包含其他库的两个目录是/usr/local/lib和/opt/lib,因此将这些目录添加到动态加载器的搜索路径中。
创建一个新文件/etc/ld.so.conf通过运行以下命令
cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib # End /etc/ld.so.conf EOF