【问题标题】:Is it safe to replace GCC's system-level C++ runtime with a version from newer GCC?用较新 GCC 的版本替换 GCC 的系统级 C++ 运行时是否安全?
【发布时间】:2010-07-30 02:42:08
【问题描述】:

Linux C++ 程序使用 GCC 链接构建,针对 libgcc_s.so.1libstdc++.so.6 库,每个库都包含多个 ABI:较新版本包含先前版本的 ABI 和新版本。 GCC ABI policy document 表示针对旧运行时构建的程序应该能够与新运行时一起运行。因此,理论上,旧的二进制文件应该可以在新系统上运行。

如果我有一个运行时间较旧的系统,并且不想在这个系统上升级 GCC,我可以手动将上述库替换为新库吗?理论上,链接到它的所有旧可执行文件都应该可以工作(包括 GCC 本身),但感觉就像是一个杂物。

这样做安全吗?

【问题讨论】:

  • 不是编程问题,投票转为超级用户。
  • @Ben Voigt,我不同意。这需要有关 GCC C++ ABI 实现方式的特定知识以及混合这些库的实践经验。
  • 虽然对于程序员来说了解 ABI 细节很有用,但这基本上是一个系统管理问题。程序员通常必须了解系统管理,但这个问题不涉及任何第一方代码。
  • @Ben:如果不具备 GCC、C++ 和 ABI 的丰富知识,那么任何系统管理员都无法为这个问题提供有意义的答案,而这些知识永远不会具备正常的系统管理员职责。

标签: c++ linux gcc


【解决方案1】:

也许,但我不推荐它,至少在没有广泛测试的情况下不会这样做,这几乎肯定会吃掉任何收益。原因如下:

  • “ABI 兼容”不一定是“错误兼容”。即使保持了 ABI 兼容性,如果您的应用在某种程度上依赖于以前版本的库中不正确的行为,它们仍可能会以令人惊讶的方式中断。
  • 可能有新的错误最终会破坏您的应用程序,同样不会与 ABI 不兼容。
  • 如果您没有完全正确地编译新库,它们可能与 ABI 兼容。
  • 您确定原始库是从原始 GNU 源代码编译的吗?也许有你不知道的补丁。如果您不能确定这一点,就无法确定现有系统/应用的兼容性。

你在这里的目标是什么?如果您只想编译使用更新功能的 C++ 应用程序,您可以在原始版本旁边安装新版本的 GCC,您只需要确保您可能使用的所有库也都是使用新版本构建的。

【讨论】:

  • 我想用 GCC 4.5 构建并部署在只有 GCC 4.1 或 4.2 的 libstdc++ 的系统上。但是除非并行安装新的 GCC 版本,否则它看起来越来越不像一个好主意。
  • @Alex:如果归根结底,我会静态链接。二进制文件可能很大(相对而言),但对于一次性的事情,我不会担心它,而且你会省去担心库版本的所有麻烦。只需将静态二进制文件放到旧系统上即可。
  • @AlexB:古老的回应,但是:尝试使用指向现有系统目录的安装目录配置新的 GCC。从发行版的构建脚本中复制配置。但是不要使用make install。您可以将 make install 安装到临时目录(查看发行版打包脚本),然后从那里进行手动安装或创建自己的发行版包,排除所有新库。
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 2014-06-27
  • 1970-01-01
  • 2015-05-12
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
相关资源
最近更新 更多