我有共享对象 sw_core.so 。我需要有这个" .so"的多个实例(单独的内存分配)。在主程序中。在主程序中,我将调用 sw_core.so 中定义的findViewById
函数。所有display_context()
都需要并行运行。 sw_core.so 是线程安全的(根据我的知识没有内存依赖)。
要解决上述问题,
display_context()
用于调用带有dlopen
的 sw_core.so ,以拥有" .so"。RTLD_LAZY
用于通过pthread
display_context()
dlsym()
时会发生segfault。 答案 0 :(得分:0)
通过多次加载相同的库,目前尚不清楚您要做什么。共享库的数据段,每个进程在一个副本中创建一次,并由库中指定的任何初始值初始化。
如果调用使用存储在库中的某些数据或状态,最好在这种情况下覆盖它。
答案 1 :(得分:0)
注意:我在Synopsys工作。如果您和Priyan一样好,您可以在内部与我联系。
接下来,Valgrind的观点
内存泄漏可能不是问题。我建议您先确保没有memcheck
个问题。 memcheck
是单线程的,因此问题不应与线程相关。之后,您可以使用DRD或Helgrind来检测线程问题。
最后,我认为您无法打开共享库的多个不同实例。手册页(here)说
如果使用dlopen()再次加载相同的共享对象,则相同 返回对象句柄。动态链接器维护引用 计算对象句柄,因此动态加载的共享对象是 在多次调用dlclose()之前不会释放 因为dlopen()成功了。任何初始化返回(参见 以下)只被召唤一次。但是,后续的dlopen()调用 使用RTLD_NOW加载相同的共享对象可能会强制符号 先前使用RTLD_LAZY加载的共享对象的解析。
答案 2 :(得分:0)
Dlopen
概率不起作用,因为它会导致sw_core.so
的不同版本之间错误共享公共符号。要实现正确的隔离,请使用dlmopen:
void *h = dlmopen (LM_ID_NEWLM, "path/to/sw_core.so", RTLD_LAZY | RTLD_LOCAL);
答案 3 :(得分:0)
非常感谢您的帮助!我可以多次成功加载单个库,每个库都使用dlmopen()在单独的命名空间中。只有我遇到的问题是gcc不支持dlmopen()。我检查到4.9版本,但没有成功。使用g ++,在加载时没有出现任何问题。
所有静态,全局,静态全局变量都为加载的库的每个实例都有自己的内存。
注意: - 我正在使用我自己的lib(dlmopen的参数)进行此实验而不是任何标准库。