用另一个共享库覆盖一个共享库的弱符号

时间:2013-12-03 16:59:24

标签: c++ c linux shared-libraries weak-linking

我有一个与(共享)库libFoo.so链接的程序。现在我需要编写该库的修补版本。称它为libFooPatch虽然名称也是libFoo.so。这个定义了一个额外的弱符号Init。

第一种情况(仅供澄清):
现在假设我在程序中实现了“Init”。在运行时,libFooPatch通过LD_LIBRARY_PATH加载 如果程序与libFoo链接,则从libFooPatch调用“Init”会导致它仅调用弱引用版本,而不是程序中的版本。将它与libFooPatch相关联可以修复它并且它可以正常工作 1)但是为什么呢?不应该在运行时调用程序中强引用的“Init”吗?

现在真正的问题(第二种情况):
我不能改变程序本身。它没有定义“Init”并且与libFoo链接。我可以通过将它放入LD_LIBRARY_PATH来改变仍然代替libFoo的libFooPatch 我想编写一个(共享)库libBar,它在程序中使用(最有可能是dlopen),将“Init”定义为强符号并使libFooPatch调用此符号。
但是我无法让它发挥作用。永远不会调用我自己的Init函数,甚至在libBar中获取指针也只能从libFooPatch获取弱函数。

“nm libBar.so”返回“0000000000000eb0 T Init”,因此在那里正确定义,不是吗?

如何指导我如何使用它?

0 个答案:

没有答案