如何将我的动态库的要求降级到 glibcxx 3.4.20?
How to downgrade requirement to glibcxx 3.4.20 of my dynamic library?
我曾经在 Docker 中为 Centos7 构建我的动态库,一切正常,直到发生某些事情(或者我改变了一些事情),现在 .so 需要 libstdc++ 和 glibcxx 3.4.20。如何降低要求?谢谢!
注意:
- 我不需要为库提供 libstdc++
- 我无法安装新包
- 我不需要按照很多帖子的建议更新LD_LIBRARY_PATH
- 我无法静态升级 GCC 或 link stdc++
我只需要知道升级的原因,以及如何恢复即可。
更新:
如果我执行 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
看起来 throw_out_of_range_fmt 被 vector::range_check 使用了。但是为什么它开始使用它而之前没有使用throw_out_of_range_fmt?
But why it started using it and didn't use throw_out_of_range_fmt before?
您开始使用一些以前没有使用过的功能。猜测:
- 您启用了例外,但之前禁用了例外,
- 您现在正在呼叫
std::vector::at
之前没有呼叫过。
您可以通过将 -Wl,-y,_ZSt24__throw_out_of_range_fmtPKcz
添加到您图书馆的 link 行来 准确地 找到对 _ZSt24__throw_out_of_range_fmtPKcz
的引用来自何处.这将告诉您库中的哪个 .o
需要符号。
使用objdump -dr foo.o
查找对符号的引用,您就会知道是哪个函数在调用它。
正如 Jesper Juhi 已经评论过的,如果您需要您的库与 pre-GCC-4.9 libstdc++
一起工作,您应该使用 pre-GCC-4.9 编译器构建它。
我曾经在 Docker 中为 Centos7 构建我的动态库,一切正常,直到发生某些事情(或者我改变了一些事情),现在 .so 需要 libstdc++ 和 glibcxx 3.4.20。如何降低要求?谢谢!
注意:
- 我不需要为库提供 libstdc++
- 我无法安装新包
- 我不需要按照很多帖子的建议更新LD_LIBRARY_PATH
- 我无法静态升级 GCC 或 link stdc++
我只需要知道升级的原因,以及如何恢复即可。
更新: 如果我执行 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
看起来 throw_out_of_range_fmt 被 vector::range_check 使用了。但是为什么它开始使用它而之前没有使用throw_out_of_range_fmt?
But why it started using it and didn't use throw_out_of_range_fmt before?
您开始使用一些以前没有使用过的功能。猜测:
- 您启用了例外,但之前禁用了例外,
- 您现在正在呼叫
std::vector::at
之前没有呼叫过。
您可以通过将 -Wl,-y,_ZSt24__throw_out_of_range_fmtPKcz
添加到您图书馆的 link 行来 准确地 找到对 _ZSt24__throw_out_of_range_fmtPKcz
的引用来自何处.这将告诉您库中的哪个 .o
需要符号。
使用objdump -dr foo.o
查找对符号的引用,您就会知道是哪个函数在调用它。
正如 Jesper Juhi 已经评论过的,如果您需要您的库与 pre-GCC-4.9 libstdc++
一起工作,您应该使用 pre-GCC-4.9 编译器构建它。