如何在应用程序中包含相同静态库的不同版本?

时间:2016-06-06 11:29:07

标签: linker shared-libraries static-libraries

我有一个包含AA.so的应用程序。 AA.so内部包括CC.a版本1。

现在我必须将BB.so包含在同一个应用程序中以获得其他功能。 BB.so还包括CC.a版本2.

我没有任何这些库的源代码。

我的问题是 - 如何确保来自AA.so的函数调用转到CC.a版本1并从BB.so调用转到CC.a版本2?

1 个答案:

答案 0 :(得分:0)

  

如何确保来自AA.so的函数调用转到CC.a版本1并从BB.so调用转到CC.a版本2?

您无法确保以自包含的方式构建AA.soBB.so,并且无法重建它们。

你可以做的是尝试通过使用dlopen("AA.so", RTLD_LAZY|RTLD_LOCAL)在运行时加载库以及BB.so的希望来完成此工作图书馆不会互相踩踏。

理论上(RTLD_LOCAL是重要的一点)应该有效。在实践中,有很多方法可以打破;你冒险进入非常危险的境地。

它今天也可以工作,但是当更新任一共享库时中断。您真的应该与您的图书馆供应商合作,以摆脱这种多重不兼容的版本混乱。

<强>更新

  

我相信共享对象不依赖于任何其他东西,从这个意义上说它们是独立的。

&#34;不依赖于其他任何东西&#34;部分是必要的,但还不够。

通常,共享库导出链接到其中的所有全局函数和数据。假设CC.a包含全局函数foo;假设此功能的版本1和版本2不兼容,fooAA.so BB.so 导出。在这种情况下,无论哪个库首先加载都会赢。如果先加载AA.so,那么从BB.sofoo的调用将被解析为AA.so内的定义,您的程序将破坏其状态或崩溃。

要验证不是这种情况,您应该在nm -DAA.so上运行BB.so,并确认从这些库导出的符号的交集是空的。如果它不为空,则必须验证这两个定义是否兼容。