Olduğunu böcek hiçbir 961964 R2012b (8.0) beri bilinen MATLABin. MATLAB, statik TLS ile bazı kitaplıkları dinamik olarak yükler (iş parçacığı yerel depolaması, örneğin bkz. Gcc derleyici bayrağı -ftls-modeli). Çok fazla sayıda kitap yüklemek => boşluk kalmadı.
Şimdiye kadar mathwork'ün tek çözümü, önemli (!) Kitaplıkları önce onları erken kullanarak yüklemektir (startup.m'ye "ones (10) * one (10);" koymanızı önerirler). Bu "çözüm stratejisi" hakkında yorum yapmasam iyi olur.
Linux x86_64 ile R2013b'den (8.2.0.701) bu yana benim deneyimim: "doc" (grafik yardım sistemi) kullanmayın! Bu doc yardımcı programının (libxul, vb.) Çok fazla statik TLS belleği kullandığını düşünüyorum.
İşte bir güncelleme (2013/12/31)
Aşağıdaki testlerin tümü, Fedora 20 (glibc-2.18-11.fc20 ile) ve Matlab 8.3.0.73043 (R2014a Ön Sürüm) ile yapılmıştır.
TLS hakkında daha fazla bilgi için, ELF şu anda mevcut Konu-Yerel Depolama, Version 0.21, 2013 için taşıma Ulrich Drepper bkz Akkadia ve Redhat .
Tam olarak ne olur?
MATLAB dinamik olarak (dlopen ile) tls başlatması gereken birkaç kitaplığı yükler. Tüm bu kitapların dtv'de (dinamik iş parçacığı vektörü) bir yuvaya ihtiyacı vardır. MATLAB bu kitaplıkların birçoğunu derleme / bağlama zamanında çalışma zamanında dinamik olarak yüklediğinden, bağlayıcının (mathworks'te) ihtiyaç duyulan yuvaları sayma şansı yoktu (önemli olan budur). Artık dinamik kitap yükleyicinin görevi, çalışma zamanında böyle bir durumu ele almaktır. Ancak bu kolay değil. Dl-open.c'den alıntı yapmak için:
Statik TLS için belleği burada ve şimdi ayırmalıyız. Bu, DTV'de bellek ayırmayı içerir. Ancak kendi DTV'yi değiştiremeyiz. Bu nedenle, DTV'de yer olduğunu garanti edemezsek, denemeyiz ve yükü bırakmayız bile.
Glibc'nin dinamik lib yükleyicisinde, böyle bir karmaşa için bir dizi ek yuva ayırmak için bir derleme süresi sabiti (DTV_SURPLUS olarak adlandırılır, bkz. programı). Fedora 20'nin glibc-Sürümünde bu değer 14'tür.
Benim durumumda dtv yuvalarına ihtiyaç duyan ilk kütüphaneler (MATLAB çalıştıran):
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
Evet 14'ten fazla => çok fazla => dtv'de hiç boşluk kalmadı. Hata mesajının bize ve özellikle de matematik işlerini anlatmaya çalıştığı şey budur.
Kayıt için: MATLAB'ın lisansını ihlal etmemek için, MATLAB ile birlikte gönderilen ikili dosyaların herhangi bir kısmının hatalarını ayıklamadım, kaynak koda dönüştürmedim veya parçalarına ayırmadım. Yalnızca MATLAB'ın kitaplıkları dinamik olarak yüklemek için kullandığı Fedora 20'nin ücretsiz ve açık glibc ikili dosyalarının hatalarını ayıkladım.
Bu sorunu çözmek için ne yapılabilir?
3 seçenek vardır:
(a) MATLAB'ı yeniden oluşturun ve bu kitaplıkları dinamik olarak yüklemeyin (ilk exec tls modeli ile) bunun yerine onlara bağlanın (daha sonra bağlayıcı gerekli yuvaları sayabilir!)
(b) Bu kitaplıkları yeniden oluşturun ve ilk exec tls modelini kullanmadıklarından emin olun.
(c) glibc'yi yeniden oluşturun ve glibc / sysdeps / generic / ldsodefs.h'de DTV_SURPLUS'ı artırın
Açıkçası (a) ve (b) seçenekleri yalnızca matematik çalışmaları tarafından yapılabilir.
(C) seçeneği için hiçbir MATLAB kaynağına ihtiyaç yoktur ve bu nedenle matematik çalışmaları olmadan yapılabilir.
Mathworks'teki durum nedir?
Bunu gerçekten "MathWorks Teknik Destek Departmanı" na anlatmaya çalıştım. Ama izlenimim şu: beni anlamıyorlar. Destek talebimi kapattılar ve Ocak 2014'te bir teknik destek yöneticisi ile bir telefon (!) Görüşmesi önerdiler.
Bunu açıklamak için elimden gelenin en iyisini yapacağım, ama dürüst olmak gerekirse: Kendime pek güvenmiyorum.
Güncelleme (2014/01/10): Şu anda mathworks (b) seçeneğini deniyor.
Güncelleme (2014/03/19): libiomp5.so dosyası için yeni derlenmiş bir sürümü (statik TLS'siz) mathworks, 961964 hata raporunda indirebilirsiniz . Ve diğer libler? Orada gelişme yok. Bu yüzden "dlopen: statik TLS ile daha fazla nesne yükleyemiyorum" ve "doc" ile şaşırmayın , örn . 1003952 hata raporuna bakın .