我有一个与(共享)库 libFoo.so 链接的程序。现在我需要编写该库的补丁版本。称它为 libFooPatch,尽管名称也将是 libFoo.so。这个定义了一个额外的弱符号 Init。
第一种情况(只是为了澄清):
现在假设我会在程序中实现“Init”。在运行时 libFooPatch 通过 LD_LIBRARY_PATH 加载。
如果程序与 libFoo 链接,从 libFooPatch 调用“Init”会导致它仅调用弱引用版本,而不是来自程序的版本。将它与 libFooPatch 链接可以解决这个问题,并且它可以正常工作。
1)但这是为什么呢?不应该在运行时调用程序中强引用的“Init”吗?
现在真正的问题(第二种情况):
我无法更改程序本身。它没有定义“Init”并且与 libFoo 相关联。我可以通过将 libFooPatch 放入 LD_LIBRARY_PATH 来更改仍然不是 libFoo 的 libFooPatch。
我想编写一个在程序中使用的(共享)库 libBar(很可能是 dlopen),将“Init”定义为一个强符号并让 libFooPatch 调用它。
但是我无法让它工作。我自己的 Init 函数永远不会被调用,甚至在 libBar 中获得一个指针也只能让我从 libFooPatch 中获取弱指针。
“nm libBar.so”返回“0000000000000eb0 T Init”,所以它在那里被正确定义,不是吗?
任何指示我怎样才能让它工作?