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

如果你把这个包缺省的优化参数(包括 -march-mcpu 参数)改变的话,它会有些不正常的表现。因此,如果你定义了任何优化参数的话,比如 CFLAGSCXXFLAGS,我们劝你在编译 Glibc 时 unset 或修改它们。

Glibc 的编译系统是高度自给自足的,即使我们的编译器 specs 文件和连接器还指向 /tools 目录,也能完美安装。我们在安装 Glibc 前不能调整 specs 文件和连接器,因为 Glibc 的 autoconf 测试会产生假结果,从而妨碍我们创建一个干净系统的目标。

linuxthreads 源码包包含 Glibc 安装的线程库的手册页。在 Glibc 源码目录中解开 linuxthreads 的源码包:

tar -xjvf /sources/glibc-linuxthreads-2.3.4.tar.bz2

在2.6.11.x内核下,Glibc会有两个测试项目不能通过,这是既不是Glibc也不是内核的原因,而是测试工具自身的原因造成的。如果你使用的是2.6.11.x的内核,请先打上补丁:

patch -Np1 -i ../glibc-2.3.4-fix_test-1.patch

Glibc 文档推荐在源码目录之外的一个专门的编译目录下进行编译:

mkdir ../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

新的配置选项的意思是:

--libexecdir=/usr/lib/glibc

pt_chown 程序的位置从默认的 /usr/libexec 改到 /usr/lib/glibc

编译软件包:

make
[Important]

重要

本节的 Glibc 测试很重要。在任何情况下都不要省略这一步。

对结果进行测试:

make check

Glibc 的测试套件高度依赖于宿主系统的工具和环境,尤其是内核。通常,测试总是会通过。但在某些特定条件下,有些失败还是不可避免,比如math测试。下面是一些常见的错误:

  • math 测试在一些使用较老的Intel或AMD的系统上会失败,某些优化设置也会导致该测试失败。

  • gettext 测试在某些宿主系统上会失败,原因尚不清楚。

  • atime 测试会在使用 noatime 选项挂载 LFS 分区时失败(参见Section 2.4, “挂载新分区”)。安装 LFS 时请勿使用 noatime 选项挂载 LFS 分区。

  • 在一些很老很慢的机器上,一些测试会由于超时而失败。

在安装 Glibc 的过程中,它会警告缺少 /etc/ld.so.conf 文件。其实这没什么关系,不过下面的命令能修正它:

touch /etc/ld.so.conf

安装软件包:

make install

上面的命令没有安装 locale(用另一种语言反馈信息),所以用下面的命令来安装它们:

make localedata/install-locales

为了节省时间,上一个命令(生成并安装所有的 locale)的替代方案是只安装想要和需要的 locale 。使用 localedef 命令可以做到这一点。这个命令的信息在 Glibc 的代码树里的 INSTALL 文件中有详细叙述。然而,为了将来的软件包测试的通过,许多 locale 还是需要的,比如 GCC 中的 libstdc++ ,下面的命令能安装运行测试套件所必需的最少 locale :

mkdir -p /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 命令安装的 locale 中有许多并不被 LFS 和 BLFS 系统的应用程序支持。所以你不应当将 LFS 系统应用到需要处理多字节字符(包括UTF-8)或者从右向左书写的场合。有许多非官方的和不稳定的补丁可以修正这些问题,但是LFS的开发者们并不支持这些补丁。上述应用于 ja_JP 和 fa_IR 的 locale 也包含在不被支持的行列——安装它们仅仅是为了通过 GCC 和 Gettext 的测试而已。watch 程序(Procps程序包的一部分)并不能正确的处理这些 locale。有关这些问题的深入讨论文档位于与国际化相关的 hint。

创建 linuxthreads 手册,该手册是关于线程API的很棒的参考资料(也适用于NPTL):

make -C ../glibc-2.3.4/linuxthreads/man

安装 linuxthreads 手册:

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 --remove-destination /usr/share/zoneinfo/[xxx] \
    /etc/localtime

[xxx] 替换成 tzselect 的输出结果。

cp 命令参数的意思

--remove-destination

强制删除已存在的符号链接。我们采用拷贝文件而不是创建符号链接的原因是:有可能 /usr 在单独的分区上,如果启动进入单用户模式,就会出问题。

6.11.3. 配置动态链接库加载程序

默认情况下,动态链接库加载程序(/lib/ld-linux.so.2)搜索 /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 locales 支持。

localedef

编译 locale 标准。

mtrace

读取并解释一个内存跟踪文件然后以人类可读的格式显示一个摘要。

nscd

提供对常用名称设备调用的缓存的守护进程。

nscd_nischeck

检查在进行 NIS+ 检查时是否需要安全模式。

pcprofiledump

打印 PC profiling 产生的信息。

pt_chown

一个辅助程序,帮助 grantpt 设置子虚拟终端的属主、用户组、读写权限。

rpcgen

产生实现远程过程调用(RPC)协议的 C 代码。

rpcinfo

对 RPC 服务器产生一个 RPC 呼叫。

sln

用来创建符号链接,由于它本身是静态连接的,在 ln 不起作用的时候,sln 仍然可以建立符号链接。

sprof

读取并显示共享目标的特征描述数据。

tzselect

对用户提出关于当前位置的问题并输出时区信息到标准输出。

xtrace

通过打印当前执行的函数跟踪程序执行情况。

zdump

显示时区。

zic

时区编译器。

ld.so

帮助动态链接库执行的辅助程序。

libBrokenLocale

帮助应用程序(如Mozilla)处理破损的 locale 。

libSegFault

段故障信号处理器。

libanl

异步名称查询库。

libbsd-compat

为了在 linux 下执行一些 BSD 程序,libbsd-compat 提供了必要的可移植性。

libc

主 C 库,集成了最常用函数。

libcrypt

用于的加密库。

libdl

动态连接接口库。

libg

g++ 运行时库。

libieee

IEEE 浮点运算库。

libm

数学函数库。

libmcheck

包括了启动时需要的代码。

libmemusage

帮助 memusage 搜集程序运行时的内存占用信息。

libnsl

提供网络服务的库。

libnss

名称服务切换库,包含了解释主机名,用户名,组名,别名,服务,协议等等的函数。

libpcprofile

包含用于跟踪某些特定源代码的CPU使用时间的 profiling 函数。

libpthread

POSIX 线程库。

libresolv

创建、发送、解释到互联网域名服务器的数据包。

librpcsvc

提供 RPC 的其他杂项服务。

librt

提供了大部分的 POSIX.1b 运行时扩展接口。

libthread_db

对多线程程序的调试很有用。

libutil

包含了在很多不同的 Unix 程序中使用的“标准”函数。