이것은 R2012b (8.0) 이후로 알려진 MATLAB의 961964 버그 입니다. MATLAB은 정적 TLS (스레드 로컬 저장소, 예 : gcc 컴파일러 플래그 -ftls-model 참조)를 사용하여 일부 라이브러리를 동적으로로드합니다. 너무 많은 라이브러리로드 => 남은 공간이 없습니다.
지금까지 mathwork의 유일한 해결 방법은 중요한 (!) 라이브러리를 먼저 사용하여 먼저로드하는 것입니다 (startup.m에 "ones (10) * ones (10);"을 넣는 것이 좋습니다). 이 "솔루션 전략"에 대해서는 언급하지 않는 것이 좋습니다.
Linux x86_64에서 R2013b (8.2.0.701) 이후 내 경험은 다음과 같습니다. "doc"(그래픽 도움말 시스템)을 사용하지 마십시오! 이 문서 유틸리티 (libxul 등)가 많은 정적 TLS 메모리를 사용하고 있다고 생각합니다.
다음은 업데이트입니다 (2013/12/31).
다음 테스트는 모두 Fedora 20 (glibc-2.18-11.fc20 포함) 및 Matlab 8.3.0.73043 (R2014a 프리 릴리즈)에서 수행되었습니다.
TLS에 대한 자세한 내용은 Ulrich Drepper, ELF Handling For Thread-Local Storage, 버전 0.21, 2013 (현재 Akkadia 및 Redhat 에서 사용 가능)을 참조하십시오 .
정확히 어떻게 되나요?
MATLAB은 dlopen을 사용하여 TLS 초기화가 필요한 여러 라이브러리를 동적으로로드합니다. 이러한 모든 라이브러리에는 dtv (동적 스레드 벡터)에 슬롯이 필요합니다. MATLAB은 컴파일 / 링크 시간에 런타임에 이러한 라이브러리 중 일부를 동적으로로드하기 때문에 링커 (수학 작업에서)는 필요한 슬롯을 계산할 기회가 없었습니다 (이것이 중요한 부분입니다). 이제 런타임에 이러한 경우를 처리하는 것이 동적 lib 로더의 작업입니다. 그러나 이것은 쉽지 않습니다. dl-open.c를 인용하려면 :
정적 TLS의 경우 지금 여기에서 메모리를 할당해야합니다. 여기에는 DTV에 메모리 할당이 포함됩니다. 그러나 우리는 우리 자신이 아닌 다른 어떤 DTV도 바꿀 수 없습니다. 따라서 DTV에 공간이 있다는 것을 보장 할 수 없으면 시도도하지 않고로드에 실패합니다.
glibc의 동적 lib 로더에는 이러한 혼란을위한 추가 슬롯을 예약하기위한 컴파일 시간 상수 (DTV_SURPLUS라고 함, glibc-source / sysdeps / generic / ldsodefs.h 참조)가 있습니다 (멀티 스레딩에서 정적 TLS를 사용하여 동적으로 라이브러리로드 프로그램). Fedora 20의 glibc 버전에서이 값은 14입니다.
제 경우에는 dtv 슬롯이 필요한 첫 번째 libs (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에 남은 슬롯이 없습니다. 그것이 오류 메시지가 우리에게 말하려고하는 것입니다.
기록을 위해 : MATLAB 라이선스를 위반하지 않기 위해 MATLAB과 함께 제공되는 바이너리의 일부를 디버그, 디 컴파일 또는 디스 어셈블하지 않았습니다. 저는 MATLAB이 libs를 동적으로로드하는 데 사용하는 Fedora 20의 자유 개방형 glibc 바이너리 만 디버깅했습니다.
이 문제를 해결하기 위해 무엇을 할 수 있습니까?
3 가지 옵션이 있습니다.
(a) MATLAB을 다시 빌드하고 해당 libs (초기 실행 TLS 모델 사용)를 동적으로로드하지 않고 대신 링크합니다 (그러면 링커가 필요한 슬롯을 계산할 수 있습니다!).
(b) 해당 라이브러리를 다시 빌드하고 initial-exec tls 모델을 사용하지 않는지 확인하십시오.
(c) glibc를 다시 빌드하고 glibc / sysdeps / generic / ldsodefs.h에서 DTV_SURPLUS를 늘립니다.
분명히 옵션 (a)와 (b)는 mathworks에서만 수행 할 수 있습니다.
옵션 (c)의 경우 MATLAB 소스가 필요하지 않으므로 수학없이 수행 할 수 있습니다.
Mathworks의 상태는 어떻습니까?
나는 이것을 "MathWorks 기술 지원 부서"에 정말로 설명하려고 노력했습니다. 그러나 내 인상은 : 그들은 나를 이해하지 못한다. 그들은 내 지원 티켓을 닫고 2014 년 1 월 기술 지원 관리자와 전화 (!) 대화를 제안했습니다.
나는 이것을 설명하기 위해 최선을 다할 것이지만 솔직히 말해서 나는 그다지 자신이 없다.
업데이트 (2014/01/10) : 현재 mathworks에서 옵션 (b)를 시도하고 있습니다.
업데이트 (2014/03/19) : libiomp5.so 파일의 경우 mathworks, bug report 961964 에서 새로 컴파일 된 버전 (정적 TLS 제외)을 다운로드 할 수 있습니다 . 그리고 다른 libs? 거기에 개선이 없습니다. 따라서 "dlopen : cannot load any more object with static TLS"를 "doc"와 함께 가져 오는 것에 놀라지 마십시오 (예 : 버그 보고서 1003952 참조) .