【问题标题】:Should compiling c++ in Xubuntu 19.04 be different then compiling c++ in Ubuntu 18.04在 Xubuntu 19.04 中编译 c++ 是否应该与在 Ubuntu 18.04 中编译 c++ 不同
【发布时间】:2019-09-13 22:13:42
【问题描述】:

是否会出现 C++ 代码在 Ubuntu 18.04 中编译没有错误但在 Xubuntu 19.04 中无法编译的情况。我最初的猜测是没有,但后来一位教授告诉我有一些链接器问题可能会导致这种情况。另外让我补充一点,代码是使用相同的 std 和 g++ 编译的。

【问题讨论】:

  • 根据编译工具链的具体版本,默认g++,是的,编译结果可能不同
  • Ubuntu 18.04 有g++-7.4.0 ... Ubuntu 19.04 有g++-8.3.0

标签: c++ linux ubuntu


【解决方案1】:

是否会出现 C++ 代码在 Ubuntu 18.04 中编译没有错误但在 Xubuntu 19.04 中无法编译的情况。

可能,但它只出现在极端情况下。大多数 C++ 代码不会受到影响。

我认为这取决于 GCC 版本。大约在那个时候,GCC 开始默认启用 PIE,这导致了一些链接问题。例如,参见Initial SUPERCOP Haswell results for round 2。来自邮件列表消息:

... 此消息的其余部分解释了上面的 -fPIC -fPIE。在 完全相同的长期支持版本的 Ubuntu,具有 假定兼容的系统提供的 gcc 和 clang 版本,如果 你跑

   gcc -c x.c; clang -c y.c; gcc -o x x.o y.o

x.c 说的地方

   #include <stdio.h>
   extern int thenumber(void);
   int main() { printf("%d\n",thenumber()); return 0; }

y.c 说

   static int myconstant = 5;
   int thenumber(void) { return myconstant; }

然后编译失败,同时进行

   gcc -c x.c; clang -c y.c; clang -o x x.o y.o

   gcc -c x.c; gcc -c y.c; gcc -o x x.o y.o

   clang -c x.c; clang -c y.c; clang -o x x.o y.o

工作正常。潜在的问题是编译器编写器管理不善 持续过渡到

  • -fPIC:将库编译为“与位置无关的代码”(这通常被宣传为对共享库很重要);

  • -fPIE:将 main() 等编译为与位置无关的代码(这通常被宣传为对声称的安全性很重要 地址空间布局随机化的好处);和

  • -pie:链接位置无关的可执行文件。

编译为位置无关代码的代码可以链接到 位置相关的可执行文件或位置无关的可执行文件。一种 正确管理的过渡将包括

  • 默认开启-fPIC和-fPIE,

  • 为任何位置相关的代码发出自动警告

  • 等待指定的年数让人们摆脱任何以前编译的位置相关代码,最后

  • 默认开启-pie。

发生的事情是 gcc 突然笨拙地打开 -pie 打破所有现有的位置相关代码,甚至设法 在同一系统上破坏与clang的兼容性---clang仍然 生成位置相关的代码,然后 gcc 无法生成 可执行。这也是 gcc 现在中断的原因 crypto_kem/ntruhrss701/avx2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多