【发布时间】:2018-02-19 10:59:38
【问题描述】:
我试图在 C 中加载一个共享库两次:
lib1 = dlopen("mylib.so", RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
lib2 = dlopen("mylib.so", RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
我想要的是 lib1 和 lib2 有单独的地址空间,以便他们可以做不同的事情。目前,我能做到这一点的唯一方法是复制 mylib,使代码如下所示:
lib1 = dlopen("mylib.so", RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
lib2 = dlopen("mylib2.so", RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
在有限的范围内,这对我来说很好。但是,我有一个应用程序使用该库的次数是通用的,这使得复制库很麻烦。
有没有更好的方法让每次加载库时都有一个单独的地址空间?
编辑:
我想多次加载库,因为我的应用程序正在处理一种消息队列。消息队列中的项目引用共享库的名称(例如 mylib)并包含一组应由库处理的数据。我想在多线程环境中处理 MQ,在自己的线程中运行对库方法的每个调用。 只要 MQ 只包含一次对库的调用,一切都会按预期工作。但是,当我有两个项目使用同一个库时,事情就开始变得奇怪了。
【问题讨论】:
-
所以你想让共享库不像共享库一样工作 ;-) 为什么?
-
请编辑你的问题以改进它并解释为什么你想
dlopen同一个库两次。闻起来像一些XY problem -
@BasileStarynkevitch 你是对的,对此我很抱歉。我编辑了我的问题,希望我添加了必要的信息
-
关于你为什么要这样做的描述,看来图书馆当时不是可重入的。这发生在例如在不同的调用之间共享可变状态。但是,我不排除您调用代码的方式有问题,尽管可能性较小,因为您可以通过复制库来解决它。
标签: c ubuntu shared-libraries