本节介绍如何将 glibc 2 安装为您的主要 C 库。除非您使用特殊的编译选项链接到其他版本,否则您编译的任何新程序都将与此库链接。
如果您正在使用 Redhat 或 Debian,并且已经下载了相应的 rpm 或 deb 文件,请参阅 Redhat 或 Debian 安装说明。然后您可以跳过本节。
本节介绍如何从源代码编译 glibc 2 和附加组件。如果您想更改优化或配置选项,或者使用您没有二进制文件的软件包,则必须编译库。
在配备 64 MB 内存的 i586@133 上,编译包含附加组件的完整库大约需要 3 个小时。在负载较重的 i686@200 上,大约需要半小时。
您需要从存档中提取源代码才能编译它。最好的方法是
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
这将在 glibc-2.0.6 目录中放置 linuxthreads、crypt 和 localedata 目录,configure 可以在其中找到这些附加组件。
在 glibc-2.0.6
目录中,创建一个名为 compile 的目录,并 cd 进入该目录。所有工作都将在该目录中完成,这将简化清理。(开发人员尚未非常关注使 'make clean' 完美。)
mkdir compile
cd compile
运行 ../configure
。要使用附加软件包,您需要使用 --enable-add-ons 指定它们,例如 --enable-add-ons=linuxthreads,crypt,localedata。您可能还需要指定安装路径。要匹配标准的 Linux 发行版,请指定 --prefix=/usr。(当在 Linux 系统上指定 /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
是与 /
分开的分区,则应复制而不是移动 libm.so.5
和 libc.so.5
,因为启动 linux 的程序需要它们,并且必须位于根驱动器分区上。/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,您首先需要检查软件包中的内容,然后再安装二进制文件
tar -tzvvf glibc-2.0.bin.i386.tar.gz
tar -tzvvf glibc-crypt-2.0.bin.i386.tar.gz
如果您对此感到满意,则可以使用以下命令安装 glibc
cd /
tar -xzf glibc-2.0.bin.i386.tar.gz
tar -xzf glibc-crypt-2.0.bin.i386.tar.gz
ldconfig -v
如果您有不同的架构或版本,请替换正确的文件名。最新的 glibc 版本通常不可用作二进制软件包,强烈建议您运行最新版本以避免错误。如果您无法自己构建库,请从基于 glibc 的发行版(例如 RedHat)中获取 glibc 的二进制软件包并安装它。
要从源代码安装库,请以 root 身份从 compile/
目录运行
make install
ldconfig -v
安装的最后一步(对于二进制和源代码安装)是更新 gcc specs
文件,以便您可以正确链接您的程序。要确定哪个 specs 文件是 gcc 使用的文件,请使用
% 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/<system>
复制到旧系统目录
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 库进行性能分析。示例 specs 文件可以在 示例 specs 文件 部分找到。
要测试安装,请在文件 glibc.c 中创建以下程序
#include <stdio.h>
main()
{
printf("hello world!\n");
}
并编译该程序。
% 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)
如果编译成功并在运行时生成“hello world!”,则安装成功。