我正在尝试创建一个多次重新加载共享库的应用程序.但在某个时间点,dlmopen失败并出现错误
/usr/lib/libc.so.6: cannot allocate memory in static TLS block
以下是重现此问题的最小代码:
#include <dlfcn.h>
#include <cstdio>
#include <vector>
int main() {
for (int i = 0; i < 100; ++i) {
void *lib_so = dlmopen(LM_ID_NEWLM, "lib.so", RTLD_LAZY | RTLD_LOCAL);
if (lib_so == NULL) {
printf("Iteration %i loading failed: %s\n", i, dlerror());
return 1;
}
dlclose(lib_so);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并清空lib.cpp,用.编译
g++ -rdynamic -ldl -Wl,-R . -o test main.cpp
g++ -fPIC -shared lib.cpp -o lib.so
Run Code Online (Sandbox Code Playgroud)
它似乎即使用一个线程也会崩溃.问题是:如何强制库卸载或销毁使用的未使用的命名空间LM_ID_NEWLM?
ImportError如果在tensorflow导出器之后导入OpenCV(cv2),我会得到一个.
ubuntu@ip-172-31-2-144:~/Downloads/opencv-2.4.13/release$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow.contrib.session_bundle import exporter
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so locally
>>> import cv2
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) 我有一个大型的混合java/c ++应用程序,它将多个共享库加载到java中.它在我的Ubuntu 12.04 32位机器上工作正常,但我在使用Fedora 17 64位机器时遇到问题.一切都很好,但是当我尝试运行它时,我得到:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /pathto/libmylib.so: dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏!
更新:我已经将其缩小到与PCL(点云库)依赖关系的问题.libmylib.so依赖于PCL,但如果没有安装,也可以在没有PCL的情况下编译.没有PCL编译工作正常.我正在等待PCL社区的人们回复我,我会根据他们的建议更新这个帖子.