动态链接器/加载器库 - 缺少 ld.so

动态链接器/加载器库 - 缺少 ld.so

下列的手动的描述动态链接器/加载器库:

程序 ld.so 处理 a.out 二进制文件,这是很久以前使用的格式; ld-linux.so* 处理 ELF(libc5 为 /lib/ld-linux.so.1,glibc2 为 /lib/ld-linux.so.2),每个人都已经使用它很多年了。

我使用 Ubuntu 15.04,但没有ld.so。我的系统包含一些 ld-2.21.so 的符号链接:

/lib/ld-linux.so.2 -> /lib32/ld-linux.so.2
/lib32/ld-linux.so.2 -> ld-2.21.so
/lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.21.so

这是否意味着系统无法处理 a.out 二进制文件(因为没有配备 ld.so)?此外,ld-linux.so.2 是一个符号链接,而不是手册中描述的库。怎么解释呢?

答案1

您的系统没有/lib/ld.so,因此它不具备动态链接 a.out 可执行文件的能力。如果您的内核支持静态链接的 a.out 可执行文件,它可以配备它们; Ubuntu 没有(这需要CONFIG_BINFMT_AOUT内核配置选项)。 a.out 格式在 Linux 上已经过时了大约 20 年,并且已经过时了大约 15 年,因此今天大多数系统已经停止支持它。

/lib/ld-linux.so.1/lib/ld-linux.so.2是 GNU/Linux ELF 动态加载器的两个不同版本,每个版本都有自己的ABI。版本 1(对应于 libc5)仅比 a.out 少几年就过时了,并且目前大多数系统都不支持。当前版本 2 对应于 GNU libc6。

每个体系结构都有自己的动态加载程序命名约定和版本号(不同的处理器体系结构实际上具有不同的 ABI)。/lib/ld-linux.so.2是 x86_32 名称。在 x86_64 上,通常的位置是/lib64/ld-linux-x86-64.so.2.在armel 上,位置是/lib/ld-linux.so.3,在armhf 上/lib/ld-linux-armhf.so.3,等等。

/lib/ld-linux.so.2是一个库(或更准确地说,是一个动态链接的共享对象 - 动态加载器通常不称为库)。它是到常规文件而不是常规文件的符号链接这一事实并没有改变这一点:使它成为库的是它的内容。

相关内容