【问题标题】:Is it safe to link compiled object files from different GCC versions?链接来自不同 GCC 版本的编译目标文件是否安全?
【发布时间】:2017-03-02 14:52:39
【问题描述】:

将使用不同 GCC 版本编译的源生成的对象链接到共享库是否安全?

我假设不是,但如果使用的 GCC 在代码生成和优化改进方面没有区别?是否有信息可以知道哪个 GCC 编译器不向后兼容?

我的问题也与二进制文件有关,我查看了

https://gcc.gnu.org/onlinedocs/gcc/Compatibility.html

据我了解,不同的 GCC 版本只要符合相同的 ABI 就可以兼容

【问题讨论】:

  • GCC 的版本有何不同?如果您尝试将 GCC 2.x 中的代码与 GCC 6.x 链接,则可能会出现问题。如果您将 4.9.4 与 4.9.3 混合使用,则不会有问题。我没有遇到 4.x 或 5.x 代码与 6.x 代码混合的问题,但这并不能保证您找不到问题。 OTOH,平台的 ABI(应用程序二进制接口)通常会在几年内保持稳定,并且各种不同的编译器都可以使用它,所以如果出现问题(即使是 2.x 和 6.x 版本)我也会感到惊讶。 x 被混合——前提是目标文件类型是好的)。
  • @JonathanLeffler 从 4.4 到 4.7?我在测试时没有发现任何问题,但我不确定我的测试是如何覆盖的,因为我不确定 the possible problems that can occur 是什么
  • 在我看来,部分基于经验,您不太可能遇到任何问题。我不确定我是否可以引用支持该论点的文档——这是我没有直接回答而不是 cmets 的主要原因。

标签: gcc compilation


【解决方案1】:

所以在网上做了一番研究,并阅读了几个 GCC 发行说明后,如果没有 ABI 更改,似乎 GCC 是向后兼容的。 一般来说,这会在发行说明中说明。

我还使用不同的 GCC 编译器和 GCC 链接器(不同版本的 GCC 具有不同的含义)做了一些实验,当它不兼容时(不同的 ABI 版本)我得到了链接器错误。

【讨论】:

  • 我遇到了类似的问题,也做了一些互联网研究。我系统上所有最新的 GCC 版本都可以创建 linux ELF 格式的对象文件。我想知道这是否基本上意味着它们在版本之间兼容,因为 ELF 是一种正式的格式定义。但是,我既不是 ABI 专家,也不是 ELF 主题的专家,但我认为即使生成相同的 (ELF) 格式也不一定意味着他们使用相同的 ABI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多