我正在尝试使用GCC 4.9.0构建一个向后兼容的二进制文件libstdc++.根据GCC的ABI策略和指南以及控制C++方言的选项,命令行选项-fabi-version应该可以解决问题; 但是,无论我设置哪个版本,我仍然可以从更新的版本导入符号,如下所示:
$ objdump -T binary | grep GLIBCXX_3.4.20
00000000 DF *UND* 00000000 GLIBCXX_3.4.20 _ZSt24__throw_out_of_range_fmtPKcz
Run Code Online (Sandbox Code Playgroud)
我试图-fabi-version=1到-fabi-version=5(ABI版本5个对应于GCC 4.6,这是保证是存在于目标系统上),但这些进口保持在所得到的文件卷绕.
我该如何解决?由于其他原因,回到旧的GCC版本不是我的选择.
命令行选项
-fabi-version应该可以解决问题
不,这与你想要的完全无关。该选项会影响编译器生成的代码,并不意味着您可以链接到旧版本的 libstdc++(这是您需要的,以便停止依赖较新的 libstdc++ 中的符号)。
您无法使用新的 GCC 链接到旧的 libstdc++。libstdc++ 的版本与 GCC 的版本紧密耦合,因此如果您想链接到较旧的 libstdc++,那么您需要使用较旧的 GCC 进行编译。
您不能告诉 libstdc++ 不要使用新符号,它依赖它们的原因是因为它需要它们。使用较旧的 libstdc++。
由于其他原因,我无法选择回到旧的 GCC 版本。
那你就完蛋了。
您要么需要使用较旧的 GCC,要么不动态链接到libstdc++.so.
在 Red Hat Enterprise Linux 或 CentOS 上,您可以选择使用开发人员工具集中的较新 GCC,这可以避免链接到新版本,libstdc++.so但仅与系统 GCC 兼容,即适用于 RHEL6 的 GCC 4.4 或适用于 RHEL7 的 GCC 4.7。你不能用它来兼容GCC 4.6。