共享库依赖的动态链接

3

有没有一种方法可以动态链接具有依赖关系的共享库?

例如,我有两个库,libA.so和libB.so。libB.so调用在libA.so中定义的函数。

在我的主程序中,我希望使用dlopen加载这两个库。但是,如果我尝试:

dlopen(libA.so);
dlopen(libB.so);

然后第二个dlopen会失败,因为libB有未被识别的符号。
我可以想到一些解决方法,比如将所有目标文件构建成一个共享库,或者让libB.so调用dlopen来加载libA.so,但这需要额外的工作。
我猜想这个问题的解决方式类似于内核模块的情况,你可以使用"EXPORT_SYMBOL()"来允许其他模块调用先前加载的模块中定义的函数。
类似的方法是否适用于共享库?还是我必须使用我的解决方案?
2个回答

3

我曾经遇到过类似的情况,这是我的解决方案(使用gcc工具链):

当你创建共享对象libB.so时,需要无条件地链接库libA.so,命令应该如下所示:

gcc -shared -Wl,--no-as-needed -lA -o libB.so b.o

您可以检查一下,libA.so 已经成为动态链接器的依赖项:
$ ldd libB.so
    linux-gate.so.1 =>  (0xb77ba000)
    libA.so => not found
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75f7000)
    /lib/ld-linux.so.2 (0xb77bb000)

在你的主程序中,只需要使用dlopen()打开库文件libB.so,其他库会自动被动态链接器链接。

1

您尝试过使用RTLD_GLOBAL吗?

RTLD_GLOBAL 此库定义的符号将对随后加载的库的符号解析可用。

即使B依赖于A,这也应该可以正常工作:

void * const handleA = dlopen("libA.so", RTLD_NOW | RTLD_GLOBAL);
void * const handleB = dlopen("libB.so", RTLD_NOW);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接