我的程序使用dlopen
来加载共享对象,并使用dlclose
卸载它。有时这个共享对象会再次被加载。我注意到静态变量没有重新初始化(这对我的程序非常关键),所以我在dlclose
之后添加了一个测试(dlopen
与RTLD_NOLOAD
一起使用)来查看库是否真的已经卸载。果然,它仍然在内存中。
然后我尝试重复调用dlclose
直到库真正被卸载,但我得到的是一个无限循环。这是我用来检查库是否已经卸载的代码:
dlclose(handles[name]);
do {
void *handle = dlopen(filenames[name], RTLD_NOW | RTLD_NOLOAD);
if (!handle)
break;
dlclose(handle);
} while (true);
我的问题是,如果我的dlopen
调用是唯一加载共享对象的地方,为什么在dlclose
之后我的共享对象没有被卸载?你能建议一种跟踪问题源头的方法吗?此外,为什么多次调用dlclose
没有效果,它们不是每次都会减少引用计数吗?
编辑:刚刚发现只有在使用gcc编译时才会出现这个问题。使用clang时一切正常。