首先,我知道问题的标题不是最好的。可能,这些概念是众所周知的。因此,让我们现在尝试清楚。
我有一个共享库(本机Java代理),可以将其他共享库作为插件加载。简而言之, libCore.so 在加载时执行:
H = dlopen("libPlugin1.so", RTLD_LAZY)
routine = dlsym("registration_function", H)
routine(struct Plugin)
那部分正在运行,我的问题在于插件和核心之间的交互。 例如,核心有一个名为 getDataFromTag 的函数。当插件试图调用这样的函数时,我得到以下错误:
java: symbol lookup error: libplugin1.so: undefined symbol: getDataFromTag
考虑到问题出在本机代码中,交互中不涉及Java代码。
现在,在我看来,当我执行dlopen时,链接器没有在 libPlugin1.so 中修复导入的符号。我的问题是:
-z defs
有关吗?怎么用呢?它是如何工作的?附加点,每个插件都有一个名为registration_function
的函数。所以,我不能使用RTLD_GLOBAL。
答案 0 :(得分:1)
我找到了解决方案。我不知道它是否是最好的。在这里。
Do I have to link the plugin with a dependencies to the core? How? Isn't that weird? Sort of cyclic dependencies?
这正是我所做的。我在插件中包含了以下链接器开关:
LDFLAGS +=-L$(PATH_TO_CORE)
# Libraries we are dependent on
LIBRARIES+=-lCore
在核心库中,我使用RTLD_LAZY
表示性能,使用RTLD_LOCAL
来避免符号重新定义。