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

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

本文关键字:Linux 可执行文件 之间 区别 扩展名 so 共享      更新时间:2023-10-16

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

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

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

我的问题:

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

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

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

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