答:首先,查看 Linux 标准库,http://www.linuxbase.org。该网站包含关于测试软件、文件系统组织和共享库命名约定的信息。
答: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加载器在同一个包中。
答
![]() | 在执行此过程时,您应该始终准备好一个救援磁盘,以应对可能发生的意外情况! |
如果要升级像 libc4 这样非常旧的库,此过程尤其困难。但是,您应该能够将 libc4 与 libc5 库保留在同一系统中,以供仍然需要它们的程序使用。从 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.5和libm.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/或您复制它们的任何位置删除旧库的临时副本。
答:请参阅 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 库的更新版本,它们遵循大多数相同的动态链接和加载过程。升级信息包含在如何在不破坏系统的情况下升级库?中。