如何将要求降级到动态库的glibcxx 3.4.20?

时间:2019-11-24 14:55:34

标签: c++ gcc shared-libraries centos7 libstdc++

我曾经在Docker中为Centos7构建动态库,并且一切正常,直到发生某些事情(或者我更改了某些东西),现在.so要求libstdc ++和glibcxx 3.4.20。如何降级要求?谢谢!

请注意:

  • 我不需要向libstdc ++提供库
  • 我无法安装新软件包
  • 我不需要按照许多帖子中的建议更新LD_LIBRARY_PATH
  • 我无法升级GCC或静态链接stdc ++

我只需要知道为什么要升级以及如何取回它。

upd: 如果我执行objdump,则会得到以下符号:

[root@a0d062ba3109 bin]# objdump -x ../plugin/va/lib/libvaplugin.so |    grep GLIBCXX_3.4.20
...
_ZSt24__throw_out_of_range_fmtPKcz@@GLIBCXX_3.4.20

看起来矢量:: range_check使用throw_out_of_range_fmt。但是,为什么它开始使用它并且以前不使用throw_out_of_range_fmt?

1 个答案:

答案 0 :(得分:1)

  

但是为什么它开始使用它并且以前不使用throw_out_of_range_fmt?

您开始使用以前未使用的某些功能。猜猜:

  1. 您启用了例外,但它们在或之前已禁用
  2. 您现在正在呼叫以前从未呼叫过的std::vector::at

通过将_ZSt24__throw_out_of_range_fmtPKcz添加到库的链接行中,可以准确地找到对-Wl,-y,_ZSt24__throw_out_of_range_fmtPKcz的引用。这将告诉您库中的哪个.o需要该符号。

使用objdump -dr foo.o查找对符号的引用,您将知道哪个函数正在调用它。

正如Jesper Juhi所说,如果您需要使用GCC-4.9之前版本的库libstdc++,则应使用GCC-4.9之前的编译器进行构建。