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

C++ 共享库(.so)和不带扩展名的Linux可执行文件之间的区别?,c++,linux,shared-libraries,executable,C++,Linux,Shared Libraries,Executable,澄清一下,这是一个关于二进制Linux可执行文件的问题,而不是关于脚本的问题,脚本也可以是可执行的,并且通常缺少扩展 根据我的经验,大多数Linux二进制可执行文件都缺少文件扩展名;e、 g.Linux系统上/bin目录中的大多数文件缺少扩展名 另一方面,/lib目录中的大多数文件在其文件扩展名中具有.so,并且还具有可执行权限。尝试直接执行。因此文件通常会导致seg错误或某些错误,这是有意义的,因为共享库通常是动态链接的。但据我所知,如果.so文件有一个main()入口点,那么就像您会看到的一

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

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

另一方面,
/lib
目录中的大多数文件在其文件扩展名中具有
.so
,并且还具有可执行权限。尝试直接执行
。因此
文件通常会导致seg错误或某些错误,这是有意义的,因为共享库通常是动态链接的。但据我所知,如果
.so
文件有一个
main()
入口点,那么就像您会看到的一样,它是一个普通的可执行文件(即没有扩展名的文件)

我的问题是:

  • 共享库(
    .so
    扩展名)和可执行文件(
    [none]
    扩展名)之间有什么区别?只是是否定义了
    main()
    entrypoint
  • 在C++中,在编译代码到共享库(<代码> .S/<代码>扩展)和编译代码到Linux可执行文件(<代码> [NON] 扩展)时,是否有任何差异(即传递给编译器的标志)。 Edit:讨论如何使用gcc命令行构建.so文件,但没有指出构建.so与普通可执行文件之间的区别

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

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

    您可以阅读并确认,现在的可执行文件在默认情况下也是位置独立的(至少在x86-64上没有显式的
    -无饼状图
    选项),以支持地址空间布局随机化。例如,在我的机器上,
    gcc-v
    输出:
    Target:x86_64-linux-gnu配置为:--启用默认饼图…
    @Evg我明白了。在我的系统上,它不是(
    Target:x86_64-redhat-linux
    ),但我在回答中对此做了说明。