6. 系统库

问:在哪里可以找到 Linux 系统规范?
问:ld.so 是什么?如何获取它?
问:如何在不破坏系统的情况下升级库?
问:关于 ELF 和 glibc 都是些什么?

问:在哪里可以找到 Linux 系统规范?

答:首先,查看 Linux 标准库,http://www.linuxbase.org。该网站包含关于测试软件、文件系统组织和共享库命名约定的信息。

问:ld.so 是什么?如何获取它?

答:ld.so 是动态库加载器。每个使用共享库的二进制文件过去都有大约 3K 的启动代码来查找和加载共享库。现在,这段代码已被放入一个特殊的共享库中,/lib/ld.so,所有二进制文件都可以在其中找到它,这样可以减少磁盘空间浪费,并且可以更轻松地升级。

ld.so可以从 http://tsx-11.mit.edu/pub/linux/packages/GCC/ 和镜像站点获取。撰写本文时的最新版本是ld.so.1.9.5.tar.gz.

/lib/ld-linux.so.1对于 ELF(“关于 ELF 都是些什么?”),它是相同的东西,并且与a.out加载器在同一个包中。

问:如何在不破坏系统的情况下升级库?

Warning在执行此过程时,您应该始终准备好一个救援磁盘,以应对可能发生的意外情况!

如果要升级像 libc4 这样非常旧的库,此过程尤其困难。但是,您应该能够将 libc4libc5 库保留在同一系统中,以供仍然需要它们的程序使用。从 libc5 升级到更新的 glibc2 库也是如此。

升级动态库的问题在于,一旦您删除旧库,您需要升级到新版本库的实用程序将无法工作。有一些方法可以解决这个问题。一种方法是临时放置运行时库的备用副本,这些库位于/lib/,在/usr/lib/,或/usr/local/lib/,或另一个列在/etc/ld.so.conf文件中的目录。

例如,当升级 libc5 库时,/lib/中的文件可能看起来像

libc.so.5 libc.so.5.4.33 libm.so.5 libm.so.5.0.9

这些是 C 库和数学库。将它们复制到另一个列在/etc/ld.so.conf中的目录,例如/usr/lib/:

 $ cp -df /lib/libc.so.5* /usr/lib/
 $ cp -df /lib/libm.so.5* /usr/lib/
 $ ldconfig

请务必运行 ldconfig 以升级库配置。

文件libc.so.5libm.so.5是实际库文件的符号链接。升级时,如果旧链接仍然存在,则不会创建新链接,除非您将 -f 标志与 cp 一起使用。 cp-d 标志将复制符号链接本身,而不是它指向的文件。

如果您需要直接覆盖库的链接,请将 -f 标志与 ln 一起使用。

例如,要将新库复制到旧库之上,请尝试以下操作。首先创建指向新库的符号链接,然后将库和链接都复制到/lib/,使用以下命令。

 $ ln -sf ./libm.so.5.0.48 libm.so.5
 $ ln -sf ./libc.so.5.0.48 libc.so.5
 $ cp -df libm.so.5* /lib
 $ cp -df libc.so.5* /lib

同样,请记住在复制库后运行 ldconfig

如果您确信一切正常,您可以从/usr/lib/或您复制它们的任何位置删除旧库的临时副本。

问:关于 ELF 和 glibc 都是些什么?

答:请参阅 Daniel Barlow 的 ELF HOWTO。请注意,这不是文件move-to-elf,它详细描述了如何手动升级到 ELF。

Linux 有两种不同的可执行文件、目标文件和目标代码库格式,称为“ELF”。(旧格式称为“a.out”。)它们具有优势,包括更好地支持共享库和动态链接。

a.out 和 ELF 二进制文件可以共存于一个系统上。但是,它们使用不同的共享 C 库,两者都必须安装。

如果您想了解您的系统是否可以运行 ELF 二进制文件,请查看/lib中名为libc.so.5的文件。如果它在那里,您可能拥有 ELF 库。如果您想知道您的安装实际上是否是 ELF,您可以选择一个代表性程序,例如 ls,并对其运行 file 命令

 -chiark:~> file /bin/ls
 /bin/ls: Linux/i386 impure executable (OMAGIC) - stripped

 valour:~> file /bin/ls
 /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1, stripped 

有一个补丁可以让 1.2.x 使用 ELF 编译器进行编译,并生成 ELF core dumps,地址为 ftp://tsx-11.mit.edu/pub/packages/GCC/。您不需要该补丁仅为了运行 ELF 二进制文件。1.3.x 及更高版本完全不需要该补丁。

GNU glibc2 库本质上是 ELF 库的更新版本,它们遵循大多数相同的动态链接和加载过程。升级信息包含在如何在不破坏系统的情况下升级库?中。