我必须制作一个dso,即静态链接stdc ++并且需要可以从内存中卸载动态。所以我尝试使用--disable-gnu-unique-object
编译gcc并使用带有-Wl,--no-gnu-unique
选项的黄金链接。但两者都包含内存泄漏问题,即使我在main中调用dlopen() dlclose()
也没有做任何事情。测试代码如:
int main()
{
for(int i=0;i<1000;i++)
{
void * h=dlopen(filepath);
if(h)
dlclose(h);
}
return 0;
}
我之前和之后检查了内存cat /proc/pid/maps
,我发现每次只有堆变化越来越大。 1000次后调用dlopen&amp;跟我说90M还是太大了。
026fb000-0274e000 rw-p 00000000 00:00 0 [heap]
经过大约两周的谷歌搜索后,这个问题没有任何帮助。只找到如下here所述的文件。
-fno-GNU唯一 在具有最新GNU汇编程序和C库的系统上,C ++编译器使用“STB_GNU_UNIQUE”绑定来确保 模板静态数据成员和静态局部变量的定义 内联函数即使存在“RTLD_LOCAL”也是唯一的; 这是避免两个人使用的库的问题所必需的 不同的“RTLD_LOCAL”插件取决于其中一个中的定义 他们并因此不同意另一个关于绑定的问题 符号。但这会导致受影响的DSO忽略“dlclose”; 如果您的程序依赖于通过“dlclose”重新初始化DSO “dlopen”,你可以使用-fno-gnu-unique。
这是一个linux错误吗?在这个问题上有没有人能帮助我?谢谢。 环境是gcc 5.3.1。我链接了定义_GLIBCXX_USE_CXX11_ABI。