6.11. Glibc-2.3.4

Glibc 软件包包含了主要的 C 库。这个库提供了用于分配内存、搜索目录、打开和关闭文件、读取和写入文件、字符串处理、模式匹配、算术运算等等的基本例程。

预计编译时间: 12.3 SBU
所需磁盘空间: 476 MB
安装依赖于: Bash、Binutils、Coreutils、Diffutils、Gawk、GCC、Gettext、Grep、Make、Perl、Sed 和 Texinfo

6.11.1. 安装 Glibc

[Note]

注意

一些 LFS 之外的软件包建议安装 GNU libiconv,以便将数据从一种编码转换为另一种编码。该项目的主页 (https://gnu.ac.cn/software/libiconv/) 上说:“这个库提供了一个 iconv() 实现,用于那些没有该实现的系统,或者其实现无法从/向 Unicode 转换的系统。 ” Glibc 提供了一个iconv()实现,并且可以从/向 Unicode 转换,因此在 LFS 系统上不需要 libiconv。

已知此软件包在其默认优化标志(包括 -march-mcpu 选项)被更改时会出现问题。如果定义了任何覆盖默认优化的环境变量,例如CFLAGSCXXFLAGS,在构建 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 选项的含义

--libexecdir=/usr/lib/glibc

这会将 pt_chown 程序的默认位置从/usr/libexec更改为/usr/lib/glibc.

编译软件包

make
[Important]

重要

在本节中,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

6.11.2. 配置 Glibc

需要创建/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

在回答几个关于位置的问题后,脚本将输出时区的名称(例如,EST5EDTCanada/Eastern)。然后创建/etc/localtime文件,通过运行

cp -v --remove-destination /usr/share/zoneinfo/[xxx] \
    /etc/localtime

[xxx] 替换为 tzselect 提供的时区名称 (例如, Canada/Eastern)。

cp 选项的含义

--remove-destination

这是强制删除已存在的符号链接所必需的。复制文件而不是使用符号链接的原因是为了涵盖/usr位于单独分区的情况。当启动到单用户模式时,这可能很重要。

6.11.3. 配置动态加载器

默认情况下,动态加载器(/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

6.11.4. Glibc 的内容

已安装程序: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, nscd_nischeck, pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace, zdump, 和 zic
已安装库: ld.so, libBrokenLocale.[a,so], libSegFault.so, libanl.[a,so], libbsd-compat.a, libc.[a,so], libcrypt.[a,so], libdl.[a,so], libg.a, libieee.a, libm.[a,so], libmcheck.a, libmemusage.so, libnsl.a, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.[a,so], libresolv.[a,so], librpcsvc.a, librt.[a,so], libthread_db.so, 和 libutil.[a,so]

简短描述

catchsegv

当程序因段错误终止时,可用于创建堆栈跟踪

gencat

生成消息目录

getconf

显示文件系统特定变量的系统配置值

getent

从管理数据库获取条目

iconv

执行字符集转换

iconvconfig

创建快速加载 iconv 模块配置文件

ldconfig

配置动态链接器运行时绑定

ldd

报告每个给定程序或共享库所需的共享库

lddlibc4

辅助 ldd 处理目标文件

locale

告诉编译器启用或禁用 POSIX 语言环境用于内置操作

localedef

编译语言环境规范

mtrace

读取和解释内存跟踪文件,并以人类可读的格式显示摘要

nscd

一个守护进程,为最常见的名称服务请求提供缓存

nscd_nischeck

检查 NIS+ 查找是否需要安全模式

pcprofiledump

转储 PC 性能分析生成的信息

pt_chown

grantpt 的辅助程序,用于设置从属伪终端的所有者、组和访问权限

rpcgen

生成 C 代码以实现远程过程调用 (RPC) 协议

rpcinfo

向 RPC 服务器发出 RPC 调用

sln

一个静态链接的 ln 程序

sprof

读取并显示共享对象性能分析数据

tzselect

询问用户系统的位置,并报告相应的时区描述

xtrace

通过打印当前执行的函数来跟踪程序的执行

zdump

时区转储器

zic

时区编译器

ld.so

共享库可执行文件的辅助程序

libBrokenLocale

被诸如 Mozilla 之类的程序用于解决损坏的语言环境

libSegFault

段错误信号处理程序

libanl

一个异步名称查找库

libbsd-compat

提供在 Linux 下运行某些 Berkeley 软件发行版 (BSD) 程序所需的可移植性

libc

主要的 C 库

libcrypt

密码库

libdl

动态链接接口库

libg

g++ 的运行时库

libieee

电气和电子工程师协会 (IEEE) 浮点库

libm

数学库

libmcheck

包含启动时运行的代码

libmemusage

memusage 用于帮助收集有关程序内存使用情况的信息

libnsl

网络服务库

libnss

名称服务交换库,包含用于解析主机名、用户名、组名、别名、服务、协议等的函数。

libpcprofile

包含用于跟踪特定源代码行中花费的 CPU 时间量的性能分析函数

libpthread

POSIX 线程库

libresolv

包含用于创建、发送和解释到 Internet 域名服务器的数据包的函数

librpcsvc

包含提供各种 RPC 服务的函数

librt

包含提供 POSIX.1b 实时扩展指定的大部分接口的函数

libthread_db

包含用于为多线程程序构建调试器的有用函数

libutil

包含用于许多不同 Unix 实用程序中的“标准”函数的代码