强制G ++(GCC)到特定的libstdc ++版本(GLIBCXX_ *)

时间:2014-06-27 14:58:26

标签: gcc g++ libstdc++

我正在尝试使用GCC 4.9.0构建一个与libstdc++向后兼容的二进制文件。根据GCC的ABI Policy and GuidelinesOptions Controlling C++ Dialect,命令行选项-fabi-version应该可以解决问题;但是,无论我设置哪个版本,我仍然可以从更新的版本导入符号,如下所示:

$ objdump -T binary | grep GLIBCXX_3.4.20
00000000      DF *UND*  00000000  GLIBCXX_3.4.20 _ZSt24__throw_out_of_range_fmtPKcz

我已经尝试-fabi-version=1-fabi-version=5(ABI版本5对应于GCC 4.6,保证会出现在目标系统上),但这些导入会在结果文件中逐渐消失。

我该如何解决这个问题?由于其他原因,回到旧的GCC版本不是我的选择。

1 个答案:

答案 0 :(得分:1)

  

命令行选项-fabi-version应该可以解决问题

不,这与您想要的完全无关。该选项会影响编译器生成的代码,但这并不意味着您可以链接到旧版本的libstdc ++(这是您需要的,以便根据更新的libstdc ++中的符号停止运行)。

您不能使用新的GCC链接到较旧的libstdc ++。 libstdc ++的版本与GCC的版本紧密相关,因此,如果要链接到较旧的libstdc ++,则需要使用较旧的GCC进行编译。

您不能告诉libstdc ++不使用新符号,它依赖于它们的原因是因为它需要它们。使用较旧的libstdc ++。

  

由于其他原因,我无法选择使用旧版GCC。

那你就被搞砸了。

您要么需要使用较旧的GCC,要么不动态链接到libstdc++.so

在Red Hat Enterprise Linux或CentOS上,您可以选择使用Developer Toolset中较新的GCC,这样可以避免链接到新的libstdc++.so,但仅与系统GCC兼容,后者为GCC 4.4。 RHEL6的RHEL6或GCC 4.7。您不能使用它与GCC 4.6兼容。