【问题标题】:Multiple GCC versions resulting in multiple heaps, leading to crashes?多个 GCC 版本导致多个堆,导致崩溃?
【发布时间】:2013-06-07 06:57:13
【问题描述】:

我下载了一个带有大量静态和动态库的 Linux C SDK。自述文件是这样说的:

此 SDK 使用 gcc 版本 4.5.1 编译。

您不应将此 SDK 二进制文件与其他 gcc 版本混合,因为 您的应用程序最终将加载两个不同的 libcs​​,它们 导致两个不同的堆。混合堆会导致应用 崩溃,当试图释放由另一个分配的内存时 堆。

我从未听说过这样的事情,并且在网络上进行搜索也没有得到任何确认。我确实找到了关于 ABI 的东西,但据我了解,这只是意味着这些库可能与我的 GCC 版本不兼容,因为它们根本不运行。这与 libc 版本或堆无关。

那么,自述文件所说的是真的吗?或者,更笼统地说:我是否应该永远不要尝试使用我从 Internet 下载的库与另一个 GCC 版本而不是编译它们的版本? 如果我想使用多个使用不同 GCC 版本编译的库怎么办?

谢谢大家, 莫里茨

【问题讨论】:

  • 我没有听说过类似的事情。我可能会删除 SDK,然后去找一个不会带来麻烦的 SDK。
  • 我已经运行了使用不同 libc 和 gcc 版本编译的代码,没有问题。不过,它可能与该库和特定版本的 GCC 相关。自述文件声称它特定于释放内存,因此它通常可能不是问题,因为幸运的是分配内存的同一个堆释放了它,并且他们试图让您免于罕见但难以追踪的错误。
  • 可能是这些 SDK 之一强制使用它们随编译器套件提供的特定 libc。就像嵌入式系统的 SDK,它会自动链接 uclibc 或 Dietlibc。
  • SDK 的供应商似乎很困惑,C 库是独立于 GCC 的,所以如果他们担心混合 C 库,那么它与 GCC 4.5.1 编译在很大程度上无关紧要,也许正如 fork0 所暗示的那样,他们的意思是它是用特定的 C 库编译的,而使用不同的 C 库(例如 GNU libc)可能是个问题……但在这种情况下,仅说明它是用 GCC 4.5.1 编译的,是非常没用的。

标签: c gcc


【解决方案1】:

这可能是由于用于构建 SDK 的优化。如果混合使用高度优化的二进制文件,则更有可能崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多