ld.so 是可执行文件吗?

Tim*_*Tim 1 linker load

$ 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
Run Code Online (Sandbox Code Playgroud)

那么是ld-2.27.so 共享库吗?

据说它是一个动态链接器/加载器在 man 的第 8 节中提到过。那么它是一个可执行文件吗?

如果是,为什么它像共享库一样命名为*.so

如果不是,我该如何理解它就像一个可执行文件,因为它是一个动态链接器/加载器,并且在 man 的第 8 节中提到过?

谢谢。

Ste*_*itt 5

两者都是,这是完全有效的

ld.so风格的命名方案在很大程度上是历史的; 这种风格的第一个动态链接器是 SunOS 4,它被命名ld.so(我在某处有它的历史,一旦我找到它,我会澄清这一点)。但是将其命名为共享库而不是可执行文件是有正当理由的,包括:

  • 它的存在是为了服务可执行文件,比如共享库(没有可执行文件运行就没有意义);
  • 它是一个共享的 ELF 对象,但它不需要解释器(它没有.interp条目);这是库的典型特征(共享的,或者说是动态链接的,可执行文件总是需要解释器;否则它们是静态链接的)。

可执行文件和库之间的区别在 ELF 中有些不确定;任何具有入口点和/或解释器的 ELF 对象都可以是可执行文件,而不管其其他属性如何。