gcc 创建 mime 类型 application/x-sharedlib 而不是 application/x-application

gcc creates mime type application/x-sharedlib instead of application/x-application

给定以下 C++ 代码 'mini.cpp':

#include "iostream"

using namespace std;

int main() {
    cout << "Hello World" << endl;
    return 0;
}

和编译器命令:

g++ -o hello mini.cpp

的结果
mimetype hello

hello: application/x-sharedlib

如何获得 'application/x-application' 作为 mime 类型?

我在 Kubuntu 上使用 gcc 6.2.0。

gcc 没有设置 mime 类型。 mimetype 根据文件内容猜测合适的 mime 类型。对于 ELF 文件(大多数编译的二进制文件和共享库),the header 包含一个字段 e_type 来标识其类型。如果是ET_DYN,那么mimetype会把它当作一个共享库。

默认情况下,gcc/ld 将生成将 e_type 设置为 ET_EXEC 的二进制文件,这些二进制文件被检测为 application/x-executable。当使用命令行选项 -pie 时,将创建一个与位置无关的可执行文件,它可以像共享库一样,在不同的地址加载并仍然有效。因为这与共享库非常相似,所以为了避免对加载程序进行太多更改,此类二进制文件被标记为 ET_DYN,即使它们可以直接执行。

一些 Linux 发行版(包括您的发行版)已将 -pie 设置为默认值。仍然可以用 -no-pie 覆盖它,但是错误检测到 mime 类型这一事实不应被视为错误,除非您知道自己在做什么,否则不应覆盖它。 -pie 允许一些额外的安全保护,这些保护从根本上与 -no-pie.

不兼容

要在 Qt/C++ GUI 应用程序上解决它,请在 .pro 文件中添加以下行:

QMAKE_LFLAGS += -no-pie