5.6. Glibc-2.3.4

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

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

5.6.1. 安装 Glibc

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

一个值得注意的地方是,使用非本书建议的方法来编译 Glibc ,就是在拿系统的稳定性做赌注。

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

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

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

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

接下来为 Glibc 做编译前的准备:

../glibc-2.3.4/configure --prefix=/tools \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.0 --with-binutils=/tools/bin \
    --without-gd --with-headers=/tools/include \
    --without-selinux

配置选项的意思是:

--disable-profile

它关掉了 profiling 信息相关的库文件编译。如果你打算做 profiling ,就省掉这个参数。

--enable-add-ons

这个指示 Glibc 使用附加的 NPTL 包作为线程库。

--enable-kernel=2.6.0

这个告诉 Glibc 编译支持2.6.x内核的库。

--with-binutils=/tools/bin

这个参数并不是必需的。但它们能保证在编译 Glibc 时不会用错 Binutils 程序。

--without-gd

这个参数保证不生成 memusagestat 程序,这个程序会顽固地连接到宿主系统的库文件(libgd, libpng, libz 等等)。

--with-headers=/tools/include

这个参数指示 Glibc 按照前面刚刚安装到 tools 目录中的内核头文件编译自己,从而精确的知道内核的特性以根据这些特性对自己进行最佳化编译。

--without-selinux

当从一个含有 SELinux 特性的宿主系统(如FC3)编译时,Glibc 将会将 SELinux 支持编译进来。由于 LFS 工具链并不包含 SELinux 支持,所以一个含有 SELinux 特性的 Glibc 将会导致许多操作失败。所以这里明确禁用它。

在这个阶段你可能会看到下面的警告:

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 应当提供的一部分。如果担心宿主系统的 msgfmt 有兼容性问题,你可以升级宿主系统的 Gettext ,也可以忽略这个问题而不去管它。

编译软件包:

make

现在编译完成了。正如前面说过的,在这里运行测试没什么用处,但是如果你坚持要测试的话可以运行下列命令:

make check

关于测试失败重要性的讨论请参考这里: Section 6.11, "Glibc-2.3.4."

在这一章里,Glibc 的测试套件高度依赖于宿主系统的工具和环境,尤其是内核。因为这个原因,有时错误很难避免,但是无需太在意。Chapter 6 里面的 Glibc 才是我们最后所使用的,那里的 Glibc 需要通过绝大多数测试。但要注意的是,即使在 Chapter 6 里,有的失败还是会出现,比如 math 测试。

当遇到一个错误时,记录下来,再用 make check 继续。测试套件会从出错的地方继续进行。你也可以用 make -k check 来一次把测试做完。但如果你这样做的话,就要把屏幕输出记录到文件里( make -k check > ck_log ),以便最后检查到底出了多少错,哪些测试出错了。

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

mkdir -v /tools/etc
touch /tools/etc/ld.so.conf

安装软件包:

make install

不同的国家和文化,使用不同的习俗来交流。这样的习俗很多,从比较简单的时间和日期格式,到非常复杂的语言发音。GNU 程序的"internationalization"(国际化,又称"i18n",18表示中间的18个字母)是以 locales 来实现的。

[Note]

注意

如果刚才没有运行测试套件,那么现在就没有必要安装 locales 。在下一章里面我们将会安装。

如果你一定要安装 locale ,请执行下面的命令:

make localedata/install-locales

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

mkdir -pv /tools/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

关于这个软件包的详细资料位于 Section 6.11.4, "Contents of Glibc."