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

时间:2016-12-30 15:13:36

标签: c++ linux gcc mime-types

给出以下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

我如何获得应用程序/ x-application&#39;作为哑剧型?

我在Kubuntu上使用gcc 6.2.0。

2 个答案:

答案 0 :(得分:7)

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类型被错误检测的事实不应该被视为一个错误,除非你知道你正在做什么,否则你不应该&#39} ; t覆盖它。 -pie允许一些与-no-pie根本不兼容的额外安全保护。

答案 1 :(得分:1)

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

QMAKE_LFLAGS += -no-pie