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

标签 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

如何将“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 不兼容。

关于c++ - gcc 创建 mime 类型 application/x-sharedlib 而不是 application/x-application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41398444/

相关文章:

linux - “神奇”值设备驱动程序

linux - Grep 不停

c - 在 gcc 中使用嵌套循环时 printf 不起作用

c++ - C99 和 C++ 的内联函数的兼容定义

GCC——针对 HP-UX 的目标三元组

c++ - 无法修改类中的非 Const 成员

c++ - QT 类型被外部库定义为 int?

c++ - 取负值时 "x = -x"和 "x *= -1"之间是否存在功能差异?

Python 的 easy_install 和自定义头文件/库位置

c++ - 为什么与比较类不在同一个命名空间中时,std::variant无法找到operator <()