我正在尝试使用GCC 4.9.0构建一个与libstdc++
向后兼容的二进制文件。根据GCC的ABI Policy and Guidelines和Options 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版本不是我的选择。
答案 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兼容。