下一页 上一页 目录

5. 作为主要 C 库安装。

本节介绍如何将 glibc 2 安装为您的主要 C 库。除非您使用特殊的编译选项链接到其他版本,否则您编译的任何新程序都将与此库链接。

如果您正在使用 Redhat 或 Debian,并且已经下载了相应的 rpm 或 deb 文件,请参阅 Redhat 或 Debian 安装说明。然后您可以跳过本节。

5.1 从源代码构建库。

本节介绍如何从源代码编译 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
 

5.2 为安装做准备。

现在您需要移动一些文件以为新库做准备,无论您是从源代码还是二进制文件安装。任何新编译的程序都将链接到 glibc,但未静态链接的旧程序仍将依赖于 libc 5,因此您不能直接覆盖旧版本。

  1. 创建一个新目录来保存旧文件到
     mkdir -p /usr/i486-linuxlibc5/lib
     
    
  2. 旧的头文件必须从 /usr/include 中移出
     mv /usr/include /usr/i486-linuxlibc5/include
     
    
  3. 创建一个新的 include 目录并设置到其他 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
  4. 恢复任何额外的头文件和链接。一些非标准库(如 ncurses)将文件放在 /usr/include 中,或在 /usr/include 中放置指向其 include 目录的链接。为了正确使用额外的库,需要恢复这些文件和链接。
  5. 将您的新库目录(例如 /usr/i486-linuxlibc5/lib放在您的 /etc/ld.so.conf 文件的顶部。您应该安装 ld.so 1.8.8 或更高版本,以避免在安装 glibc 后出现奇怪的消息。
  6. 将所有旧的 C 库移动/复制到新目录中。
     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.5libc.so.5,因为启动 linux 的程序需要它们,并且必须位于根驱动器分区上。
  7. /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
     
    
  8. 在移动库后更新您的库缓存。
     ldconfig -v
     
    

5.3 从二进制软件包安装。

如果您要从预编译的二进制文件安装 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 的二进制软件包并安装它。

5.4 从源代码安装。

要从源代码安装库,请以 root 身份从 compile/ 目录运行

 make install
 ldconfig -v
 

5.5 更新 gcc specs。

安装的最后一步(对于二进制和源代码安装)是更新 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 文件 部分找到。

5.6 测试您的安装。

要测试安装,请在文件 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!”,则安装成功。


下一页 上一页 目录