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

C 如何解决两个共享库之间的相互引用?,c,unix,linker,shared-libraries,C,Unix,Linker,Shared Libraries,首先,我知道问题的标题不是最好的。这些概念很可能是众所周知的。因此,现在让我们试着澄清一下 我有一个共享库(原生Java代理),它可以作为插件加载其他共享库。简而言之,libCore.so在加载时: H = dlopen("libPlugin1.so", RTLD_LAZY) routine = dlsym("registration_function", H) routine(struct Plugin) 这部分工作正常,我的问题是插件和核心之间的交互。 例如,core有一个名为getDat

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

我有一个共享库(原生Java代理),它可以作为插件加载其他共享库。简而言之,libCore.so在加载时:

H = dlopen("libPlugin1.so", RTLD_LAZY)
routine = dlsym("registration_function", H)
routine(struct Plugin)
这部分工作正常,我的问题是插件和核心之间的交互。 例如,core有一个名为getDataFromTag的函数。当插件试图调用这样的函数时,我得到以下错误:

java: symbol lookup error: libplugin1.so: undefined symbol: getDataFromTag
考虑到问题在于本机代码,交互中没有涉及Java代码

现在,在我看来,链接器并没有修复libPlugin1中导入的符号。所以当我执行dlopen时。我的问题是:

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

另外,每个插件都有一个名为
registration\u function
的函数。因此,我无法使用RTLD_GLOBAL。

我找到了一个解决方案。我不知道这是不是最好的。来了

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\u LAZY
来提高性能,并使用
RTLD\u LOCAL
来避免符号的重新定义。

您是否尝试过使用
RTLD\u NOW
而不是
RTLD\u LAZY
?我不是100%确定这会起作用,但可能会主动解析getDataFromTag,因此它可用于插件。不,它现在在加载时失败(在dlopen期间)。但这是同样的问题。它找不到核心中定义的符号。我还尝试了使用单个插件的RTLD_GLOBAL,但失败了。最近我也使用了同样的方法(使用
RTLD_NOW | RTLD_GLOBAL
)。但我想这可能是因为你的libCore.so被链接了。你在什么平台上?你用过什么链接器交换机?我用的是Linux。我正在使用:
LDFLAGS=-Wl,-soname=$(LIBRARY)-static libgcc
LIBRARIES=-lc-ldl
。我不能使用RTLD_GLOBAL,因为插件共享一些符号的名称。这是我在linux上的链接器开关:
-shared
,而不是libCore.so的
-static libgcc
,以及libPlugin的另一个
-lCore
。对于静态链接libCore.a的二进制文件,我还需要
-rdynamic