安装 Glibc-2.3.2

预计所需编译时间:      12.3 SBU
预计所需硬盘空间:      784 MB

Glibc的内容

Glibc 是提供系统调用和基本函数的 C 库,比如open, malloc, printf等等。所有动态连接的程序都要用到它。

安装下列程序: catchsegv, gencat, getconf, getent, glibcbug, 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], libc_nonshared.a, 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]

Glibc 安装依赖关系

Glibc 依赖于: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed, Texinfo.

安装 Glibc

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

注: 本节的Glibc测试套件很重要。我们建议在任何情况下都别省略这一步。

在安装glibc前,你必须用 cd 命令进入 glibc-2.3.2 目录然后解压 glibc-linuxthreads 压缩包,别把 glibc-linuxthreads 解压到通常的 /usr/src 目录下了。

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

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

touch /etc/ld.so.conf

运用我们前面用过的那个补丁:

patch -Np1 -i ../glibc-2.3.2-sscanf-1.patch

Glibc 的安装指南推荐用一个新建的目录来编译它,而不是在源码目录中:

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

为编译 Glibc 做准备:

../glibc-2.3.2/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --libexecdir=/usr/bin --with-headers=/usr/include

新的配置参数意思是:

编译软件包:

make

运行测试套件:

make check

安装 Glibc-2.3.2 在 第 5 章里的测试套件说明这里也同样适用,有疑问的话,就参考一下前面的内容。

安装软件包:

make install

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

make localedata/install-locales

如果你不想用上面的命令来安装 locale,你可以只安装你所需要的locale。使用命令localedef,这方面的信息在glibc-2.3.2代码树的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 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

编译 linuxthreads man 手册页:

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

最后安装这些 man 手册页:

make -C ../glibc-2.3.2/linuxthreads/man install

配置 Glibc

我们需要建立 /etc/nsswitch.conf 文件。虽然如果这个文件丢失或者不正确,glibc会使用默认的配置,但是其默认的配置无法很好地在网络环境下工作(那是我们下一章的问题)。同时我们也需要设置自己的时区。

使用如下命令建立新的 /etc/nsswitch.conf 文件:

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

publickey: files

hosts: files dns
networks: files

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: db files

# End /etc/nsswitch.conf
EOF

你可以使用 tzselect 脚本选择时区:

tzselect

按照顺序回答脚本运行过程中提出的问题,脚本运行完毕,就会给出所需时区文件的位置。比如 EST5EDTCanada/Eastern. 然后再用下列命令来创建 /etc/localtime 文件:

cp --remove-destination /usr/share/zoneinfo/Canada/Eastern /etc/localtime 

参数的意思:

当然,别盲目地填 Canada/Eastern, 应该填入你所在的时区名称,就是上面的 tzselect 脚本告诉你的那个。

配置动态链接库加载程序

在默认情况下,动态链接库加载程序(/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