跨不同共享对象的静态库的多重链接
Multiple linking of a static library across different shared objects
目前我有一个设置,其中有一个第 3 方提供的共享库,libfoo.so
。这在内部链接(不使用 --whole-archive
之类的东西)静态库(特别是英特尔性能原语)ipps.a
。这是第三方所以不能修改。
然后我构建了一个单独的共享库,libbar.so
,它也静态链接 ipps.a
。这两个库最终(连同其他一些库)链接到一个插件中,plugin.so
,然后在运行时加载。
不幸的是,这(有时)会导致运行时问题(我已经看到两者都挂在 IPP 启动时调用的初始化函数中,以及损坏的数据),因为 ipps.a
中有函数libbar.so
和 libfoo.so
.
中都存在
考虑到我无法修改第三方库,有什么办法可以解决这个问题?
What are the options to deal with this, given that I can't modify the third-party library?
你和第 3 方开发人员都犯了罪——你在你自己的界面中 暴露 来自 ipps.a
的符号(这是 UNIX 上的默认设置) .
您应该隐藏这些符号,例如使用链接器版本脚本。 Example.
如果您隐藏 libbar.so
中的所有 ipps.a
符号,那么 libfoo.so
也与 ipps.a
链接的事实应该变得无关紧要。
目前我有一个设置,其中有一个第 3 方提供的共享库,libfoo.so
。这在内部链接(不使用 --whole-archive
之类的东西)静态库(特别是英特尔性能原语)ipps.a
。这是第三方所以不能修改。
然后我构建了一个单独的共享库,libbar.so
,它也静态链接 ipps.a
。这两个库最终(连同其他一些库)链接到一个插件中,plugin.so
,然后在运行时加载。
不幸的是,这(有时)会导致运行时问题(我已经看到两者都挂在 IPP 启动时调用的初始化函数中,以及损坏的数据),因为 ipps.a
中有函数libbar.so
和 libfoo.so
.
考虑到我无法修改第三方库,有什么办法可以解决这个问题?
What are the options to deal with this, given that I can't modify the third-party library?
你和第 3 方开发人员都犯了罪——你在你自己的界面中 暴露 来自 ipps.a
的符号(这是 UNIX 上的默认设置) .
您应该隐藏这些符号,例如使用链接器版本脚本。 Example.
如果您隐藏 libbar.so
中的所有 ipps.a
符号,那么 libfoo.so
也与 ipps.a
链接的事实应该变得无关紧要。