【问题标题】:What happens to the global variables in shared library when dlclose is called on it?调用 dlclose 时共享库中的全局变量会发生什么变化?
【发布时间】:2011-06-11 13:08:20
【问题描述】:

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

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

【问题讨论】:

  • 全局变量通常来自堆。您的问题似乎使用了无效的假设。
  • @Employed 俄语,我有一个全局指针变量,我从堆中分配内存。那会发生什么?另外,如果有一个普通的静态全局变量,那会发生什么?

标签: c dll shared-libraries dlopen


【解决方案1】:

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

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

添加了受雇的俄罗斯人:

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

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

【讨论】:

  • @R,感谢您的回答。您的意思是所有具有静态存储的全局变量都会自动重置?通过 malloc 分配内存的全局指针呢?
  • 如果你问这是否会泄漏内存,答案是肯定的。指针将丢失。 不要这样做。 如果您的库需要保持全局状态,请使用一个或多个(可能很大)静态存储持续时间的对象,而不是动态分配。如果数据只是运行时生成的常量表,请编写脚本在编译时生成它们,并将它们设为static const 数组。您将牺牲(便宜的)磁盘空间并节省大量(宝贵的)内存。
  • 另请注意,有一个丑陋的解决方法:让您的库 dlopen 本身并丢弃返回的指针,以便其引用计数在加载一次后永远不会达到零。但我不建议这样做......
  • @R,非常感谢您的回答。他们信息量很大。 :)
猜你喜欢
  • 2018-12-11
  • 2023-03-20
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多