如果我使用dlopen
打开动态库并且我的程序终止而没有相应的dlclose
,那么引用计数是否会减少?如果没有,会发生什么?在下次重启之前,库是否会保持加载状态?
答案 0 :(得分:2)
动态加载器是用户空间代码(linux / glibc中的ld.so.1)。它被加载到您正在运行的程序的用户空间中,并且不与其他进程交互。所以没有全局参考计数器。
但是,有一种方法可以在进程之间共享动态库的代码。动态加载程序使用mmap()在进程内存中加载库代码。同一个库的mmap-ed数据将在使用它的所有进程之间共享(直到他们向这些数据页写入任何内容,这将使用COW创建自己的数据副本)。当程序终止时,将释放所有mmap-ed区域。您可能会认为这是一种参考计数器减量 - 您的数据页副本现在已经发布。