$ file /lib/ld-linux.so.2
/lib/ld-linux.so.2: symbolic link to i386-linux-gnu/ld-2.27.so
$ readlink -f /lib/ld-linux.so.2
/lib/i386-linux-gnu/ld-2.27.so
$ file /lib/i386-linux-gnu/ld-2.27.so
/lib/i386-linux-gnu/ld-2.27.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=7a59ed1836f27b66ffd391d656da6435055f02f8, stripped
那么是ld-2.27.so
共享库吗?
据说是动态链接器/加载器和《man》第8节提到。那么它是可执行文件吗?
如果是,为什么它被命名为共享库*.so
?
如果不是,我该如何理解它就像一个可执行文件,作为动态链接器/加载器并在 man 第 8 节中提到?
谢谢。
答案1
两者都是,这是完全有效的。
-风格的命名方案ld.so
很大程度上是历史性的;这种风格的第一个动态链接器是 SunOS 4,它被命名为ld.so
(我在某处有它的历史,一旦找到它,我会澄清这一点)。但将其命名为共享库而不是可执行文件是有充分理由的,包括:
- 它的存在是为了提供可执行文件,例如共享库(如果没有可执行文件运行,它就没有任何用途);
- 它是一个共享的 ELF 对象,但它不需要解释器(它没有
.interp
条目);这是库的典型特征(共享的,或者动态链接的,可执行文件总是需要解释器;否则它们是静态链接的)。
在 ELF 中,可执行文件和库之间的区别有些模糊;任何具有入口点和/或解释器的 ELF 对象都可以是可执行文件,无论其其他属性如何。