2011-01-19 119 views
4

如果通过dlopen和dlclose机制使用共享库(或DLL),并且共享库创建的内存来自堆的某些全局变量,那么当调用dlclose时,这些变量和内存会发生什么?当dlclose被调用时,共享库中的全局变量会发生什么变化?

如果在同一个进程中,再次调用dlopen,那么行为会是什么?

+0

全局变量do * not *通常来自堆。你的问题似乎使用无效的假设。 – 2011-01-19 06:57:34

+0

@雇用的俄罗斯人,我有一个全局指针变量,我从堆中分配内存。会发生什么?另外,如果一个正常的静态全局变量存在,那会发生什么? – Jay 2011-01-19 07:09:05

回答

8

如果dlclose减少引用计数为零,该库实际上是卸载,任何未来的图书馆应该重新加载在图书馆与静态存储所有变量重置为初始值。

但是,如果库被多次打开,除最终调用dlclose之外的所有内容都将减少引用计数。有时候,一个库是否被多次打开可能并不明显,因为它可能作为其他库的依赖被加载,除非它是程序本地的模块,所以依靠它可能不是一个好主意在这个“重置”行为。

就业俄语说:

即使库dlopen() ED和dlclose()ð只有一次,而不是别的东西,引用符号从它的行为(通过dlsym())的依赖也将增加引用计数(并使库不可卸载);至少在Linux上。

我不知道这个信息是否准确与否。将来,请将新信息发布为评论或新答案,而不是编辑其他人的答案。如果你只是编辑他人的答案,你可以让他们对你答案的正确性负责,他们可能不需要答案。

相关问题