gpt4 book ai didi

c - 加载共享库两次

转载 作者:太空宇宙 更新时间:2023-11-04 05:49:07 52 4
gpt4 key购买 nike

我试图在 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 仅包含一次对库的调用,一切都会按预期进行。然而,当我有两个项目使用同一个库时,事情就开始变得奇怪了。

最佳答案

您需要使用 dlmopen实现这种隔离:

// No need for RTLD_LOCAL, not sure about RTLD_DEEPBIND
lib1 = dlmopen (LM_ID_NEWLM, "mylib.so", RTLD_LAZY | RTLD_DEEPBIND);

关于c - 加载共享库两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48864659/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com