我有一个包含AA.so的应用程序。 AA.so内部包括CC.a版本1。
现在我必须将BB.so包含在同一个应用程序中以获得其他功能。 BB.so还包括CC.a版本2.
我没有任何这些库的源代码。
我的问题是 - 如何确保来自AA.so的函数调用转到CC.a版本1并从BB.so调用转到CC.a版本2?
答案 0 :(得分:0)
如何确保来自AA.so的函数调用转到CC.a版本1并从BB.so调用转到CC.a版本2?
您无法确保以自包含的方式构建AA.so
和BB.so
,并且无法重建它们。
你可以做的是尝试通过使用dlopen("AA.so", RTLD_LAZY|RTLD_LOCAL)
在运行时加载库以及BB.so
的希望来完成此工作图书馆不会互相踩踏。
理论上(RTLD_LOCAL
是重要的一点)应该有效。在实践中,有很多方法可以打破;你冒险进入非常危险的境地。
它今天也可以工作,但是当更新任一共享库时中断。您真的应该与您的图书馆供应商合作,以摆脱这种多重不兼容的版本混乱。
<强>更新强>
我相信共享对象不依赖于任何其他东西,从这个意义上说它们是独立的。
&#34;不依赖于其他任何东西&#34;部分是必要的,但还不够。
通常,共享库导出链接到其中的所有全局函数和数据。假设CC.a
包含全局函数foo
;假设此功能的版本1和版本2不兼容,foo
和AA.so
BB.so
导出。在这种情况下,无论哪个库首先加载都会赢。如果先加载AA.so
,那么从BB.so
到foo
的调用将被解析为AA.so
内的定义,您的程序将破坏其状态或崩溃。
要验证不是这种情况,您应该在nm -D
和AA.so
上运行BB.so
,并确认从这些库导出的符号的交集是空的。如果它不为空,则必须验证这两个定义是否兼容。