共享库 (.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 就像普通的可执行文件(即没有扩展名的文件)一样。
我的问题:
- 共享库(
.so
扩展名)和可执行文件([none]
扩展名)有什么区别?是否只是定义了 main()
入口点?
- 在 C++ 中,将代码编译成共享库(
.so
扩展名)和将代码编译成 Linux 可执行文件([none]
扩展名)。
编辑:This question 讨论了如何使用 gcc 命令行构建 .so 文件,但没有指出构建 .so 与普通可执行文件之间的区别。
- 主要区别之一是共享库没有
main()
函数。它还包含与位置无关的代码,对于可执行文件来说可能是也可能不是。如果您 do 将 main()
函数放入库中,您仍然需要 link 使用 normal 目标文件(包含无main()
功能)。
- 是的。要创建共享库,您可以使用
-fpic
or -fPIC
编译代码以生成适合在共享库中使用的与位置无关的代码 (PIC)。
尽管没有什么能阻止您创建名为 myexe.so
的可执行文件,但它不能用作共享库。
澄清一下,这是一个关于二进制 Linux 可执行文件的问题,而不是脚本,它也可以是可执行的并且通常缺少扩展名。
根据我的经验,大多数 Linux 二进制可执行文件都缺少文件扩展名;例如Linux 系统上 /bin
目录中的大多数文件都缺少扩展名。
另一方面,/lib
目录下的大部分文件的文件扩展名都是.so
,也有可执行权限。尝试直接执行 .so
文件通常会导致段错误或某些错误,这是有道理的,因为共享库通常旨在动态链接。但据我了解,如果 .so
文件有一个 main()
入口点,那么 you can run it as an executable 就像普通的可执行文件(即没有扩展名的文件)一样。
我的问题:
- 共享库(
.so
扩展名)和可执行文件([none]
扩展名)有什么区别?是否只是定义了main()
入口点? - 在 C++ 中,将代码编译成共享库(
.so
扩展名)和将代码编译成 Linux 可执行文件([none]
扩展名)。
编辑:This question 讨论了如何使用 gcc 命令行构建 .so 文件,但没有指出构建 .so 与普通可执行文件之间的区别。
- 主要区别之一是共享库没有
main()
函数。它还包含与位置无关的代码,对于可执行文件来说可能是也可能不是。如果您 do 将main()
函数放入库中,您仍然需要 link 使用 normal 目标文件(包含无main()
功能)。 - 是的。要创建共享库,您可以使用
-fpic
or-fPIC
编译代码以生成适合在共享库中使用的与位置无关的代码 (PIC)。
尽管没有什么能阻止您创建名为 myexe.so
的可执行文件,但它不能用作共享库。