估计编译时间: 14.71 SBU 估计所需硬盘空间: 369 MB |
你必须先打补丁,才能安装这个包。确认在运行下面的命令前,补丁已经解压了。
在安装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造成的)。
最后检查于 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
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
这些C库是一些程序通用的函数集。这样就可以保证程序员不用为了他的每一个单独的任务重复写相同的函数。最常见的情况是象向屏幕输出一个字符串的程序已经可以由程序员随意调用了。
C库(事实上几乎每个库)都有两种格式:动态的和静态的。简而言之,当程序调用静态的C库时,C库中的代码会拷贝到执行文件中。当程序使用动态C库时,可执行文件不会包含C库中的代码。而是在程序运行时动态加载不要的库函数。这就意味着可以明显地减小程序文件的大小。C库中包含的文档描述得更详细些,在这里只用一两行去明确地解释这些复杂知识是不现实的。
最后检查于 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