我必须制作一个 dso,静态链接 stdc++ 并且需要可以从内存动态卸载。所以我尝试编译 gcc--disable-gnu-unique-object
并使用黄金链接-Wl,--no-gnu-unique
选项。但两者都包含内存泄漏问题,即使我除了调用之外什么也不做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
前后我发现每次只有堆变化越来越大。大约 90M 在 1000 次调用 dlopen & dlclose 对我来说 90M 仍然太大了。
026fb000-0274e000 rw-p 00000000 00:00 0 [heap]
在谷歌搜索了大约两周后,但对这个问题没有任何帮助。只找到一个文档,内容如下here https://www.systutorials.com/docs/linux/man/1-gcc/.
-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 链接。
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)