这一节的内容是关于将 glibc2 安装成你的主要 C 函式库。 任何你编译的新程序都将会连结到这一个函式库, 除非你用了特殊的编译选项来连结到其它的版本。
假如你是用 RedHat 或 Debian 并且已下载相关的 rpm 或 deb 档, 请参阅 RedHat 或 Debian 的安装说明,你可以直接跳过这一节。
这一节解释如何由原始码编译 glibc 2 与附加套件。 如果你想要改变最佳化与组态选项或使用额外的套件,那你就必须编译函式库。
在一安装有 64MB 内存的 i586@133 机器上, 编译完整的函式库与附加套件大约需要三个小时。 而在 i686@200 的机器上则约需要一个半小时。
你需要从 archive 中解出原始码才能编译它, 最好的方式是:
tar xzf glibc-2.0.6.tar.gz
cd glibc-2.0.6
tar xzf ../glibc-linuxthreads-2.0.6.tar.gz
tar xzf ../glibc-crypt-2.0.6.tar.gz
tar xzf ../glibc-localedata-2.0.6.tar.gz
这将会把 linuxthreads、crypt 与 localedata 等目录放到 glibc-2.0.6 目录下,
如此 configure 才能找到这些附加套件。
在 glibc-2.0.6
的目录底下,建立一个新的目录 compile,
并且 cd 到 compile 底下,所也的工作都会在这个目录中完成,
这会简化后续的清除工作。
(发展者似乎并未让 'make clean' 作得很好)
mkdir compile
cd compile
执行 ../configure
。
要使用附加套件你必须用 --enable-add-ons 来指定,
例如 --enable-add-ons=linuxthreads,crypt,localedata。
也许你也会想要指定安装的目录,要符合 linux 标准架构,
指定为 --prefix=/usr。
(当在 linux 系统上 prefix 被设为 /usr
,
configure 知道要调整其它的路径,
好将 libc.so 以及其它重要的函式库放到 /lib
)
完整的 configure 命令如下:
../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr
要编译与验证, 执行:
make
make check
无论是由原始码编译或是预先编译好的版本,你现在必须移动某些文档来迎接新的函式库。 任何新编译的程序会被连结到 glibc,但是旧有静态连结的程序仍然倚靠著 libc 5, 所以你不能只是覆盖掉旧有的版本。
mkdir -p /usr/i486-linuxlibc5/lib
/usr/include
移开:
mv /usr/include /usr/i486-linuxlibc5/include
mkdir /usr/include
ln -s /usr/src/linux/include/linux /usr/include/linux
ln -s /usr/src/linux/include/asm /usr/include/asm
ln -s /usr/X11R6/include/X11 /usr/include/X11
ln -s /usr/lib/g++-include /usr/include/g++
这些连结须要视你的系统而稍作调整。
最少在 Slackware 中,g++ 标头文档在 /usr/local/g++-include
,
而 Debian 却放在 /usr/include/g++
,
并且将 /usr/lib/g++-include
连结到 /usr/include/g++
。
在后者的情形,你也许会想要将原始的 g++ include 目录移回到
/usr/include
。
/usr/include
,
或是在 /usr/include
放置一连结到它们的 include 目录下。
这些文档与连结必须回存,如此才可以正确的使用这些额外的函式库。
/usr/i486-linuxlibc5/lib
)
加入到 /etc/ld.so.conf
的顶端。
你最好要有 ld.so 1.8.8 或是更新的版本,
以避免在安装完 glibc 之后出现一些奇怪的信息。
mv /usr/lib/libbsd.a /usr/i486-linuxlibc5/lib
mv /usr/lib/libc.a /usr/i486-linuxlibc5/lib
mv /usr/lib/libgmon.a /usr/i486-linuxlibc5/lib
mv /usr/lib/libm.a /usr/i486-linuxlibc5/lib
mv /usr/lib/libmcheck.a /usr/i486-linuxlibc5/lib
mv /usr/lib/libc.so /usr/i486-linuxlibc5/lib
mv /usr/lib/libm.so /usr/i486-linuxlibc5/lib
cp /lib/libm.so.5.* /usr/i486-linuxlibc5/lib
cp /lib/libc.so.5.* /usr/i486-linuxlibc5/lib
假如你的 /usr
与 /
是在不同的 partition 上,
那 libm.so.5
与 libc.so.5
应该用复制的非搬移,
因为一些用来启动 linux 的程序会需要这两个函式库,
因此必须要位在 root partition。
/usr/lib/*.o
移到新的目录下。
mv /usr/lib/crt1.o /usr/i486-linuxlibc5/lib
mv /usr/lib/crti.o /usr/i486-linuxlibc5/lib
mv /usr/lib/crtn.o /usr/i486-linuxlibc5/lib
mv /usr/lib/gcrt1.o /usr/i486-linuxlibc5/lib
ldconfig -v
如果你是由一已预先编译好的 glibc 安装, 你必须:
cd /
gzip -dc glibc-2.0.bin.i386.tar.gz | tar tvvf -
gzip -dc glibc-crypt-2.0.bin.i386.tar.gz | tar tvvf -
ldconfig -v
如果你用的是不同的系统架构或是版本,请置换适当的档名。
要由原始码安装, 执行:
make install
ldconfig -v
安装的最后一步
(不管你是由预先编译好的套件或是由原始码安装)
是更新 gcc 的 spec
档,
让你可以正确的连结你的程序。
要知道 gcc 所用的是那一个 spec 档,
如下输入:
% gcc -v
reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs
gcc version 2.7.2.2
在这里,系统是 i486-unknown-linux,
而版本则是 2.7.2.2。
你必须将 /usr/lib/gcc-lib/<系统>
复制到旧的系统目录下:
cd /usr/lib/gcc-lib/
cp -r i486-unknown-linux i486-linuxlibc5
到原先的目录与版本目录下:
cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2
并修改在同一目录下的 specs
。
将这文档中的 /lib/ld-linux.so.1
改成 /lib/ld-linux.so.2
,
并且要将所有的 %{...:-lgmon}
表示式删除,
因为 glibc 不使用 gmon 函式库来做 profiling。
你可以在
Specs 档范例 找到一份 specs 档的范例。
要测试安装是否正确, 请建立 glibc.c 如下:
#include <stdio.h>
main()
{
printf("hello world!\n");
}
并且 compile 这个程序:
% gcc glibc.c -o glibc
使用 ldd 来查证这个程序是连结到 glibc2 而非你的旧 libc:
% ldd glibc
libc.so.6 => /lib/libc.so.6 (0x4000e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
假如这个程序可以通过 compile,并且在执行后产生 "hello world!"
的输出,那么表示已经安装成功。