共享库(.so)与不带扩展名的 Linux 可执行文件之间的区别?

Jac*_*ern 6 c++ linux executable shared-libraries

澄清一下,这是一个关于二进制 Linux 可执行文件的问题,而不是脚本,脚本也可以是可执行的,而且通常缺少扩展名。

根据我的经验,大多数 Linux 二进制可执行文件都缺少文件扩展名;例如,Linux 系统上目录中的大多数文件都/bin缺少扩展名。

另一方面,该/lib目录中的大多数文件都具有.so文件扩展名,并且还具有可执行权限。尝试直接执行.so文件通常会导致段错误或某些错误,这是有道理的,因为共享库通常旨在动态链接。但据我了解,如果.so文件有main()入口点,那么您可以将其作为可执行文件运行,就像正常的可执行文件一样(即没有扩展名的文件)。

我的问题:

  1. .so共享库(扩展名)和可执行文件(扩展名)有什么区别[none]?仅仅是是否main()定义了入口点吗?
  2. .so在C++中,将代码编译成共享库(扩展)和将代码编译成Linux可执行文件(扩展)有什么区别(即传递给编译器的标志)[none]

编辑:这个问题讨论了如何使用 gcc 命令行构建 .so 文件,但没有确定构建 .so 与普通可执行文件之间的差异。

Ted*_*gmo 3

  1. 主要区别之一是共享库没有函数main()。它还包含与位置无关的代码,对于可执行文件可能是也可能不是。如果您确实将函数放入main()库中,则仍然需要将其与普通目标文件( main()包含函数)链接。
  2. 是的。要创建共享库,您可以使用编译代码-fpic-fPIC生成适合在共享库中使用的位置无关代码(PIC )。

没有什么可以阻止您创建名为myexe.so虽然的可执行文件,但它不能用作共享库。