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

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

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

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

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

雇用俄罗斯人补充说:

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

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