这是自R2012b(8.0)以来已知的MATLAB No.961964。 MATLAB使用静态TLS(线程本地存储,例如,参见gcc编译器标志-ftls-model)dynamic加载一些库。 加载太多这样的libs =>没有剩余空间。
到目前为止,mathwork的唯一解决方法是首先加载重要的(!)libs(他们build议把“ones(10)* ones(10)”放在startup.m中)。 我最好不要评论这个“解决策略”。
由于R2013b(8.2.0.701)与Linux x86_64的经验是:不要使用“doc”(graphics帮助系统)! 我认为这个doc-utility(libxul等)使用了很多静态TLS内存。
这是一个更新(2013/12/31)
以下所有testing均使用Fedora 20(使用glibc-2.18-11.fc20)和Matlab 8.3.0.73043(R2014a预发布)完成。
有关TLS的更多信息,请参阅Ulrich Drepper,ELF处理线程本地存储的版本0.21,2013 ,目前可在Akkadia和Redhat获得 。
究竟发生了什么?
MATLABdynamic地(使用dlopen)加载了几个需要初始化的库。 所有这些库在dtv(dynamic线程向量)中都需要一个槽。 由于MATLAB在运行时在编译/链接时dynamic地加载了这些库中的几个,链接器(在mathworks)没有机会计算所需的槽(这是重要的部分)。 现在dynamiclib加载程序的任务是在运行时处理这种情况。 但这并不容易。 引用dl-open.c:
对于静态TLS,我们必须在这里和现在分配内存。 这包括在DTV中分配内存。 但是除了我们自己以外,我们不能改变任何DTV。 所以,如果我们不能保证在DTV中有空间的话,我们甚至不会尝试它,并且不能承受负担。
在glibc的dynamiclib加载器中有一个编译时间常量(称为DTV_SURPLUS,请参阅glibc-source / sysdeps / generic / ldsodefs.h),用于为这样的混乱预留大量额外的插槽(在multithreading中dynamic加载静态TLS库程序)。 在Fedora 20的glibc-Version中,这个值是14。
这里是第一个需要在我的情况下需要dtv插槽的库(运行MATLAB):
matlabroot/bin/glnxa64/libut.so /lib64/libstdc++.so.6 /lib64/libpthread.so.0 matlabroot/bin/glnxa64/libunwind.so.8 /lib64/libuuid.so.1 matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/server/libjvm.so matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/libfontmanager.so matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/libt2k.so matlabroot/bin/glnxa64/mkl.so matlabroot/sys/os/glnxa64/libiomp5.so /lib64/libasound.so.2 matlabroot/sys/jxbrowser/glnxa64/xulrunner/xulrunner-linux-64/libxul.so /lib64/libselinux.so.1 /lib64/libpixman-1.so.0 /lib64/libEGL.so.1 /lib64/libGL.so.1 /lib64/libglapi.so.0
是超过14 =>太多=>没有插槽留在dtv。 这就是错误信息试图告诉我们,特别是math工作。
为了logging:为了不违反MATLAB的许可证,我没有debugging,反编译或反汇编随MATLAB附带的二进制文件的任何部分。 我只debugging了用于dynamic加载库的Fedora 20的免费和开放的glibc二进制文件。
有什么可以做的,解决这个问题?
有3个选项:
(a)重buildMATLAB,不要dynamic加载这些库(使用initial-exec tls模型)而不是链接它们(然后链接器可以计算所需的插槽数)!
(b)重build这些库并确保它们不使用initial-exec tls模型。
(c)在glibc / sysdeps / generic / ldsodefs.h中重buildglibc并增加DTV_SURPLUS
显然选项(a)和(b)只能通过math工作来完成。
对于选项(c),不需要MATLAB的源代码,因此可以在没有math工作的情况下完成。
mathworks的状态是什么?
我真的试图向“MathWorks技术支持部门”解释这一点。 但我的印象是:他们不了解我。 他们closures了我的支持票,并在2014年1月与技术支持经理build议进行电话(!)交谈。
我会尽我所能解释这一点,但说实话:我不是很有信心。
更新(2014/01/10):目前mathworks正在尝试选项(b)。
更新(2014/03/19):对于文件libiomp5.so,您可以在mathworks下载最新编译的版本(不含静态TLS), bug报告961964 。 而其他的库? 那里没有改善。 所以不要惊讶得到“dlopen:无法加载静态TLS的对象”与“文档”,例如见bug报告1003952 。