Glibc 包含了主要的C库。这个库提供了基本例程,用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配、数学计算等等。
一些 LFS 基本系统之外的软件包建议安装 GNU libiconv 以使得数据够能在不同编码之间进行转换。GNU libiconv 项目的主页(http://www.gnu.org/software/libiconv/)说:"这个库为那些没有 iconv() 的系统或者虽然有 iconv() 却不能与 Unicode 相互转换的系统提供了一个能够与 Unicode 相互转换的实现 "。Glibc 库中有一个 iconv() ,并且能够与 Unicode 相互转换,因此,LFS 系统不需要 GNU libiconv 。
如果你把这个包缺省的优化参数(包括 -march 和 -mcpu 参数)改变的话,它会有些不正常的表现。因此,如果你定义了任何优化参数的话,比如 CFLAGS 和 CXXFLAGS ,我们劝你在编译时 unset 或修改它们。
Glibc 的编译系统是高度自给自足的,即使当前编译器 specs 文件和连接器还指向 /tools 目录,也能正确安装。我们在安装 Glibc 前不能调整 specs 文件和连接器,否则 Glibc 的 autoconf 测试会失败,从而妨碍我们创建一个干净系统的目标。
linuxthreads 源码包中包含 Glibc 安装的线程库的手册页。在 Glibc 源码目录中解开 linuxthreads 的源码包:
tar -xjvf ../glibc-linuxthreads-2.3.4.tar.bz2
在某些罕见的情况下,如果存在非标准的搜索目录,Glibc 会出现段错误(segfault),下面的补丁可以修正它:
patch -Np1 -i ../glibc-2.3.4-rtld_search_dirs-1.patch
在2.6.11.x内核下,Glibc 会有两个测试项目不能通过,这是既不是 Glibc 也不是内核的原因,而是测试工具自身的原因造成的。如果你使用的是2.6.11.x内核,请先打上补丁:
patch -Np1 -i ../glibc-2.3.4-fix_test-1.patch
下面的补丁修正了 Glibc 中的一个可能阻碍某些程序(包括 OpenOffice.org)运行的bug :
patch -Np1 -i ../glibc-2.3.4-tls_assert-1.patch
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
新的配置选项的意思是:
把 pt_chown 程序的位置从默认的 /usr/libexec 改为 /usr/lib/glibc 。
编译软件包:
make
本节的 Glibc 测试很重要。在任何情况下都不要省略这一步。
对结果进行测试:
make -k check >glibc-check-log 2>&1 grep Error glibc-check-log
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
为了节省时间,上一个命令(生成并安装列在 glibc-2.3.4/localedata/SUPPORTED 文件中的所有 locale)的替代方案是只安装想要的和需要的 locale 。使用 localedef 命令可以做到这一点。这个命令的信息在 Glibc 的代码树里的 INSTALL 文件中有详细叙述。然而,为了将来的软件包测试的通过,许多 locale 还是需要的,比如 GCC 中的 libstdc++ 。下面的命令能安装运行测试套件所必需的最少 locale :
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 命令安装的 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
我们需要建立 /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 目录来寻找程序需要使用的动态连接库。但是,如果某些库在这两个目录之外,你就需要把它们的路径加到 /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