在调用dlclose时,共享库中的全局变量会发生什么?

时间:2011-01-19 05:27:01

标签: c dll shared-libraries dlopen

如果正在通过dlopen和dlclose机制使用共享库(或DLL),并且如果创建的共享库有一些全局变量,其内存来自堆,那么当dlclose是这些变量和内存时会发生什么叫什么名字?

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

1 个答案:

答案 0 :(得分:8)

如果dlclose将引用计数减少到零并且实际卸载了库,则以后重新加载库时应将库中静态存储持续时间的所有变量重置为其原始值。

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

受雇俄罗斯人补充说:

  

即使库dlopen()dlclose() d恰好一次,并且不是其他内容的依赖项,从中引用符号的行为(通过dlsym())也会增加引用计数(并使库不可卸载);至少在Linux上。

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