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

Difference between shared library (.so) a Linux executable file without extension?

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

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

另一方面,/lib目录下的大部分文件的文件扩展名都是.so,也有可执行权限。尝试直接执行 .so 文件通常会导致段错误或某些错误,这是有道理的,因为共享库通常旨在动态链接。但据我了解,如果 .so 文件有一个 main() 入口点,那么 you can run it as an executable 就像普通的可执行文件(即没有扩展名的文件)一样。

我的问题:

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

编辑:This question 讨论了如何使用 gcc 命令行构建 .so 文件,但没有指出构建 .so 与普通可执行文件之间的区别。

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

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