安装 Glibc-2.2.5

估计编译时间:		14.71 SBU
估计所需硬盘空间:     369 MB

安装 Glibc

你必须先打补丁,才能安装这个包。确认在运行下面的命令前,补丁已经解压了。

在安装glibc前,你必须在glibc-2.2.5 目录而不是/usr/src下将glibc-linuxthreads解包。

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

同样地,不要把 --enable-kernel 参数传给配置脚本,否则当其它包如fileutils, make和tar时链接到glibc时可能会产生分段错误(segmentation fault)。

简单地说,如果不像本书说的这样编译Glibc,你的系统可能会变得非常危险。

命令如下:

patch -Np1 -i ../glibc-2.2.5-2.patch &&
touch /etc/ld.so.conf &&
mkdir ../glibc-build &&
cd ../glibc-build &&
../glibc-2.2.5/configure --prefix=/usr --disable-profile \
    --enable-add-ons --libexecdir=/usr/bin &&
echo "cross-compiling = no" > configparms &&
make &&
make install &&
make localedata/install-locales &&
exec /static/bin/bash --login

如果你不想用 make localedata/install-locales ,你可以只安装你所需要的locales。使用命令localedef,这方面的信息在glibc-2.2.5 代码树的INSTALL文件中有详细叙述。要注意的是, localedef 程序假设 /usr/lib/locale 目录已经存在,你需要先创建这个目录,才能用localedef命令。

Linux Threads man pages现在还不安装,因为安装它需要一个能工作的Perl,我们在本章的后面会安装Perl,然后我们会安装Linux Threads man page。

在configure(配置)阶段你会看到下面的警告:

configure: warning:
*** These auxiliary programs are missing or too old: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

缺少的msgfmt (包含在我们将在本章后面安装的 gettext包中)不会引起任何问题。msgfmt 是用来产生二进制的翻译文件,使你的系统能用另一种语言说话。因为这些文件已经有了,所以我们就不需要 msgfmt 。只有你修改了翻译的源文件( 在 po 目录下的子目录中的*.po 文件) 后,要再产生二进制文件时,你才需要 msgfmt 。

命令解释

patch -Np1 -i ../glibc-2.2.5-2.patch: 这个补丁把 malloc/Makefile 文件中所有 $(PERL) 都换成 /usr/bin/perl 。 这么做是因为我们还没有装 perl ,Glibc 就不能确定 perl 的位置。这个补丁还把 login/Makefile 文件中所有 root 换成 0 。这是因为 Glibc 自己还没有安装,不能进行从用户名到用户id的解释,所以 chown root file 会失败,除非你直接把ID告诉它。

这个补丁还修正了几个 bug 和安全漏洞。具体来说,它修正了"errlist", "dns resolver", "xdr_array", "calloc", "thread exit", "udivdi3", "math test", "restrict_arr" 和 "divbyzero" ,在 http://www.zipworld.com.au/~gschafer/lfs-tweaks.html 有文档详细地说明了这些。

touch /etc/ld.so.conf: Glibc安装的最后一步之一就是运行 ldconfig以更新动态装载器缓存。如果这个文件不存在,Glibc会因为不能读取这个文件而造成异常中断。因此我们为它创建一个空文件(这个空文件可以确保Glibc缺省使用/lib 和/usr/lib,并且现在就没有问题了)

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

--enable-add-ons:这个开关使能(enable)Glibc的附加包linuxthreads。

--libexecdir=/usr/bin: 这使 pt_chown 程序被安装到 /usr/bin 目录下。

echo "cross-compiling = no" > configparms: 我们这样做是因为我们只为自己的系统编译。举例来说,要在 Intel 系统上编译在 Apple Power PC 系统上用的程序,才用跨平台编译(cross-compiling)。Glibc 用编译一个测试程序是否成功的方法来判断我们是否在跨平台编译,而现在这个测试程序肯定不能编译成功,因为我们还没安装 Glibc 。

exec /static/bin/bash --login: 这个命令开始一个新的shell,代替当前的shell,可以在命令行中去掉"I have no name!"消息。这个消息是由于bash不能把用户的ID解释成用户名(这又是因为没有Glibc造成的)。

Glibc的内容

最后检查于 version 2.2.5.

包含的程序

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

具体说明

catchsegv

当程序发生segmentation fault的时候, 用来建立一个堆栈跟踪(a stack trace)

gencat

建立消息目录

getconf

针对文件系统的指定变量显示其系统设置值

getent

从系统管理数据库获取一个条目

glibcbug

建立一个对glibc的bug报告并且email到bug报告的邮件地址

iconv

转化字符设置.

iconvconfig

建立对iconv模块的快速读取设置文件

ldconfig

设置对动态链接库的实时绑定, 这个命令非常有用,在安装了新的库之后要运行这个命令来在系统中登记这个新库,否则装了也是白装.

ldd

列出每个程序或者命令需要的共享库

lddlibc4

辅助add操作object目标文件.

locale

是一个perl程序, 可以叫编译器对内嵌操作是否开启POSIX locales.

localedef

编译locale的设置.

mtrace

列印从源到其接收者的多点路径.

nscd

提供对通用名称调用的缓存的守护进程

nscd_nischeck

检查在对NIS+侦查的时候是否需要安全模式

pcprofiledump

打印PC profiling产生的信息

pt_chown

根据主虚拟终端给出的文件文件描述符'3'设置对子虚拟终端的所有者,组及存取权限. 帮助grantpt的运行. 不能直接从命令行运行.

rpcgen

生成执行RPC协议的C代码

rpcinfo

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

sln

是从目标文件到源的静态字符联接. 在动态链接不起作用的时候sln可以建立对库的静态联接.

sprof

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

tzselect

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

xtrace

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

zdump

显示时区.

zic

时区编译器.

包含的库文件

ld.so, libBrokenLocale.[a,so], libBrokenLocale_p.a, libSegFault.so, libanl.[a,so], libanl_p.a, libbsd-compat.a, libc.[a,so], libc_nonshared.a, libc_p.a, libcrypt.[a,so], libcrypt_p.a, libdl.[a,so], libdl_p.a, libg.a, libieee.a, libm.[a,so], libm_p.a, libmcheck.a, libmemusage.so, libnsl.a, libnsl_p.a, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.[a,so], libpthread_p.a, libresolv.[a,so], libresolv_p.a, librpcsvc.a, librpcsvc_p.a, librt.[a,so], librt_p.a, libthread_db.so, libutil.[a,so] and libutil_p.a

具体说明

ld.so

帮助动态链接库的执行.

libBrokenLocale, libBrokenLocale_p

帮助程序处理破损locale, 如:mozilla

libSegFault

处理segmentation fault信号. 会试图找出segmentation fault

libanl, libanl_p

异步名称查询库.

libbsd-compat

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

libc, libc_nonshared, libc_p

这些C库是一些程序通用的函数集。这样就可以保证程序员不用为了他的每一个单独的任务重复写相同的函数。最常见的情况是象向屏幕输出一个字符串的程序已经可以由程序员随意调用了。

C库(事实上几乎每个库)都有两种格式:动态的和静态的。简而言之,当程序调用静态的C库时,C库中的代码会拷贝到执行文件中。当程序使用动态C库时,可执行文件不会包含C库中的代码。而是在程序运行时动态加载不要的库函数。这就意味着可以明显地减小程序文件的大小。C库中包含的文档描述得更详细些,在这里只用一两行去明确地解释这些复杂知识是不现实的。

libcrypt, libcrypt_p

有关加密编码

libdl, libdl_p

动态联接界面.

libg

g++运行需要的库.

libieee

IEEE动态指针库.

libm, libm_p

数学函数库.

libmcheck

包括了起动时需要运行的代码.

libmemusage

帮助memusage搜集程序内存使用的信息

libnsl, libnsl_p

网络服务库.

libnss_compat, libnss_dns, libnss_files, libnss_hesiod, libnss_nis, libnss_nisplus

在不同的模块中加入存取数据库的不同的服务,有如下的好处:

  • 添加新服务而不用改动GNU C库,

  • 这些模块可以单独升级

  • C库会比较小.

libpcprofile

帮助内核跟踪在函数, 源码行和命令中CPU使用时间

libpthread, libpthread_p

POSIX线程库

libresolv, libresolv_p

创建,发送及解释到互联网域名服务器的数据包.

librpcsvc, librpcsvc_p

提供RPC的其他服务.

librt, librt_p

提供了大部分的POSIX.1b实时扩展的给定界面

libthread_db

对建立多线程程序的调试很有用

libutil, libutil_p

包含了在很多不同的Unix程序中使用的"标准"函数.

安装Glibc依赖于

最后检查于 version 2.2.5.

Bash: sh
Binutils: ar, as, ld, ranlib, readelf
Diffutils: cmp
Fileutils: chmod, cp, install, ln, mknod, mv, mkdir, rm, touch
Gcc: cc, cc1, collect2, cpp, gcc
Grep: egrep, grep
Gzip: gzip
Make: make
Gawk: gawk
Sed: sed
Sh-utils: date, expr, hostname, pwd, uname
Texinfo: install-info, makeinfo
Textutils: cat, cut, sort, tr