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

And*_*eas 5 c++ linux gcc mime-types

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

#include "iostream"

using namespace std;

int main() {
    cout << "Hello World" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和编译器命令:

g++ -o hello mini.cpp
Run Code Online (Sandbox Code Playgroud)

的结果

mimetype hello
Run Code Online (Sandbox Code Playgroud)

hello: application/x-sharedlib
Run Code Online (Sandbox Code Playgroud)

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

我在Kubuntu上使用gcc 6.2.0.

小智 9

gcc不设置mime类型.mimetype根据文件的内容猜出适当的mime类型.对于ELF文件(大多数编译的二进制文件和共享库),标头包含一个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.