यह R2012b (8.0) के बाद से ज्ञात MATLAB का 961964 बग नहीं है । MATLAB गतिशील रूप से स्थिर TLS (थ्रेड लोकल स्टोरेज, उदाहरण के लिए gcc कंपाइलर फ्लैग-मॉडल-मॉडल देखें) के साथ कुछ काम करता है। बहुत सारे ऐसे काम लोड हो रहे हैं => कोई जगह नहीं बची।
अब तक मैथवर्थ का एकमात्र काम है महत्वपूर्ण (?) कामों को पहले से लोड करके उनका जल्दी से जल्दी उपयोग करना (वे स्टार्टअप में) "10 (10) * वाले (10);" रखने का सुझाव देते हैं। मैं इस "समाधान रणनीति" पर बेहतर टिप्पणी नहीं करता।
चूंकि लिनक्स x86_64 के साथ R2013b (8.2.0.701) मेरा अनुभव है: "डॉक" (चित्रमय मदद प्रणाली) का उपयोग न करें! मुझे लगता है कि यह डॉक-यूटिलिटी (लिबक्सुल, इत्यादि) स्थिर टीएलएस मेमोरी का उपयोग कर रहा है।
यहाँ एक अद्यतन है (2013/12/31)
निम्नलिखित सभी परीक्षण फेडोरा 20 (glibc-2.18-11.fc20 के साथ) और Matlab 8.3.0.73043 (R2014a Prerelease) के साथ किए गए थे।
टीएलएस के बारे में अधिक जानकारी के लिए, अलरिक ड्रेपपर देखते हैं, ELF थ्रेड-स्थानीय संग्रह, संस्करण 0.21, 2013, वर्तमान में उपलब्ध के लिए से निपटने Akkadia और Redhat ।
वास्तव में क्या होता है?
MATLAB गतिशील रूप से (dlopen के साथ) कई पुस्तकालयों को लोड करता है जिन्हें tls आरंभीकरण की आवश्यकता होती है। उन सभी libs को dtv (डायनेमिक थ्रेड वेक्टर) में एक स्लॉट की आवश्यकता होती है। क्योंकि MATLAB ने इनमें से कई कामों को गतिशील रूप से संकलन / लिंक समय पर लिंकमर पर लोड किया है (लिंक पर मैथवर्क्स) को आवश्यक स्लॉट्स की गणना करने का कोई मौका नहीं मिला (यह महत्वपूर्ण हिस्सा है)। अब रनटाइम पर इस तरह के केस को हैंडल करना डायनेमिक लिब लोडर का काम है। लेकिन यह आसान नहीं है। Dl-open.c का हवाला देते हैं:
स्थैतिक TLS के लिए हमें यहाँ और अभी मेमोरी आवंटित करनी है। इसमें डीटीवी में मेमोरी आवंटित करना शामिल है। लेकिन हम अपने स्वयं के अलावा किसी भी DTV को नहीं बदल सकते। इसलिए, अगर हम यह गारंटी नहीं दे सकते हैं कि DTV में कोई जगह नहीं है, तो हम इसे करने की कोशिश भी नहीं करते हैं और लोड को विफल करते हैं।
एक संकलन समय स्थिर है (जिसे DTV_SURPLUS कहा जाता है, glibc-source / sysdeps / जेनेरिक / ldsodefs.h देखें) glibc के डायनेमिक लिब लोडर में इस तरह की गड़बड़ी के लिए कई अतिरिक्त स्लॉट जमा करने के लिए (डायनेमिक रूप से लोड हो रहे लिबास के साथ मल्टीथ्रेडिंग में मल्टीपल लोडिंग लिबास) कार्यक्रम)। फेडोरा 20 के ग्लिबक-संस्करण में यह मान 14 है।
यहाँ पहले काम (MATLAB चल रहा है) कि मेरे मामले में dtv स्लॉट की जरूरत है:
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 के साथ भेजे गए बायनेरिज़ के किसी भी हिस्से को डीबग, डिकम्पाइल या डिसेबल्ड नहीं किया। मैंने केवल फेडोरा 20 के मुक्त और खुले glibc-binaries को डिबग किया था जो MATLAB का उपयोग गतिशील रूप से लोड करने के लिए कर रहे थे।
इस समस्या को हल करने के लिए क्या किया जा सकता है?
3 विकल्प हैं:
(ए) MATLAB का पुनर्निर्माण करें और उन लिबास (प्रारंभिक-निष्पादन tls मॉडल के साथ) के बजाय उनके खिलाफ लिंक को लोड न करें (तब लिंकर आवश्यक स्लॉट्स की गणना कर सकता है!)
(b) उन परिवादों का पुनर्निर्माण करें और सुनिश्चित करें कि वे प्रारंभिक-निष्पादन tls मॉडल का उपयोग नहीं कर रहे हैं।
(c) ग्लिबैक का पुनर्निर्माण और ग्लिबैक / सिसडेप्स / जेनेरिक / ldsodefs.h में DTV_SURPLUS बढ़ाएं
स्पष्ट रूप से विकल्प (ए) और (बी) केवल गणित द्वारा किए जा सकते हैं।
विकल्प (सी) के लिए MATLAB के किसी भी स्रोत की आवश्यकता नहीं है और इस तरह से गणित के बिना किया जा सकता है।
मैथ्स पर क्या स्थिति है?
मैंने वास्तव में "मैथवर्क्स तकनीकी सहायता विभाग" को यह समझाने की कोशिश की। लेकिन मेरी धारणा है: वे मुझे नहीं समझते। उन्होंने जनवरी 2014 में एक तकनीकी सहायता प्रबंधक के साथ मेरा समर्थन टिकट बंद कर दिया और एक टेलीफोन (!) बातचीत का सुझाव दिया।
मैं इसे समझाने के लिए बहुत अच्छा करूँगा, लेकिन ईमानदार होने के लिए: मुझे बहुत विश्वास नहीं है।
अद्यतन (2014/01/10): वर्तमान में mathworks विकल्प (b) का प्रयास कर रहा है।
अद्यतन (2014/03/19): फ़ाइल libiomp5.so के लिए आप मैथवर्क्स में एक नया संकलित संस्करण (स्थिर टीएलएस के बिना) डाउनलोड कर सकते हैं, बग रिपोर्ट 961964 । और अन्य लिबास? वहां कोई सुधार नहीं हुआ। तो "dlopen:" doc के साथ स्थिर TLS के साथ किसी भी अधिक वस्तु को लोड नहीं किया जा सकता है, उदाहरण के लिए, बग रिपोर्ट 1003952 देखें ।