跨不同共享对象的静态库的多重链接

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.solibfoo.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 链接的事实应该变得无关紧要。