如何解决两个共享库之间的相互引用?

时间:2014-08-13 13:17:50

标签: c unix linker shared-libraries

首先,我知道问题的标题不是最好的。可能,这些概念是众所周知的。因此,让我们现在尝试清楚。

我有一个共享库(本机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 中修复导入的符号。我的问题是:

  • 我是否需要在libPlugin1.so中声明导入的符号?怎么样?
  • 我是否需要在libCore.so中声明导出的符号?怎么样?
  • 我是否必须将插件与依赖项链接到核心?怎么样?这不奇怪吗?循环依赖的排序?
  • 这与选项-z defs有关吗?怎么用呢?它是如何工作的?

附加点,每个插件都有一个名为registration_function的函数。所以,我不能使用RTLD_GLOBAL。

1 个答案:

答案 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来避免符号重新定义。