Bagaimana cara membangun kembali glibc di Arch Linux?

8

Sepertinya MATLAB secara kacau mengacau di Linux, karena ia "secara dinamis memuat beberapa lib dengan TLS statis" , yang tidak berarti apa-apa bagi saya selain saya mendapatkan banyak kesalahan.

Pekerjaan yang disarankan adalah untuk membangun kembali glibcdengan yang lebih besar DTV_SURPLUS. Ini membuat saya dengan dua pertanyaan:

  • Bagaimana cara saya membangun kembali glibcdi Arch Linux untuk meningkatkan DTV_SURPLUS? Saya melihat PKGBUILD di pohon abs dan tidak melihat di DTV_SURPLUSmana pun, jadi saya tidak tahu di mana harus melakukan perubahan.
  • Nilai apa yang saya tetapkan DTV_SURPLUS? Agaknya, pengaturan itu 2^64akan menjadi terlalu banyak dan ide yang buruk.

Masalah dengan MATLAB dapat dilihat dengan MWE berikut di R2014a:

>> ones(10)*ones(10);
>> doc('help');
Exception in thread "XPCOMMessageLoop" java.lang.UnsatisfiedLinkError: /opt/matlab/sys/jxbrowser/glnxa64/xulrunner/xulrunner-linux-64/libxul.so: dlopen: cannot load any more object with static TLS
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(Unknown Source)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.c(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.a(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.MozillaToolkit.initialize(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.AppShellXPCOMThread$b.run(Unknown Source)
Exception in thread "XPCOMMessageLoop" java.lang.UnsatisfiedLinkError: /opt/matlab/sys/jxbrowser/glnxa64/xulrunner/xulrunner-linux-64/libxul.so: dlopen: cannot load any more object with static TLS
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(Unknown Source)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.c(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.a(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.MozillaToolkit.initialize(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.AppShellXPCOMThread$b.run(Unknown Source)
Exception in thread "XPCOMMessageLoop" java.lang.UnsatisfiedLinkError: /opt/matlab/sys/jxbrowser/glnxa64/xulrunner/xulrunner-linux-64/libxul.so: dlopen: cannot load any more object with static TLS
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(Unknown Source)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.c(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.a(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.MozillaToolkit.initialize(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.AppShellXPCOMThread$b.run(Unknown Source)
Exception in thread "XPCOMMessageLoop" java.lang.UnsatisfiedLinkError: /opt/matlab/sys/jxbrowser/glnxa64/xulrunner/xulrunner-linux-64/libxul.so: dlopen: cannot load any more object with static TLS
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(Unknown Source)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.c(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.a(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.MozillaToolkit.initialize(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.AppShellXPCOMThread$b.run(Unknown Source)
Exception in thread "XPCOMMessageLoop" java.lang.UnsatisfiedLinkError: /opt/matlab/sys/jxbrowser/glnxa64/xulrunner/xulrunner-linux-64/libxul.so: dlopen: cannot load any more object with static TLS
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(Unknown Source)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.c(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.impl.linux.LinuxMozillaToolkit.a(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.MozillaToolkit.initialize(Unknown Source)
    at com.teamdev.jxbrowser.gecko.xpcom.AppShellXPCOMThread$b.run(Unknown Source)

Di mana ones(10)*ones(10);memuat libiomp5.soperpustakaan BLAS yang terhubung secara dinamis , yang tampaknya tidak menyisakan cukup ruang untuk tautan dinamis yang libxul.sodiperlukan untuk browser dokumentasi berbasis HTML. Secara potensial saya dapat mengatasi MWE khusus ini dengan menggunakan versi tambalan libiomp5.so, tetapi masalah umum masih berlanjut.

StrongBad
sumber
Anda mungkin lebih baik memeriksa sekitar untuk melihat apakah ada distro yang memiliki glibc sudah dikompilasi dengan DTV_SURPLUS yang lebih tinggi - mungkin dengan menguji di VM.
goldilocks
@goldilocks akan chroot cukup atau apakah saya memerlukan VM penuh?
StrongBad
Saya menemukan ini: stackoverflow.com/questions/19268293/… dan ini: mathworks.com/matlabcentral/answers/… . Pencarian Google setelah "tidak dapat memuat objek lagi dengan TLS statis" pasti memberi Anda lebih banyak ide.
schaiba
Saya ditautkan dengan pertanyaan SO dalam pertanyaan saya dan di situlah ide pembangunan kembali glibcdisarankan.
StrongBad
Kernel bukan masalah sehingga Anda bisa menggunakan chroot.
goldilocks

Jawaban:

2

Untuk mengkompilasi ulang glibc dengan kustom DTV_SURPLUSdan mengganti versi yang ada:

  1. Salin /var/abs/core/glibcke direktori lain sehingga Anda dapat menulis ke sana tanpa menjadi root, lalu cdke direktori itu.
  2. Gunakan makepkg -ountuk mengunduh dan mengekstrak kode sumber tanpa membangunnya (karena kami akan mengedit kode sumber sebelum membangun).
  3. Edit yang DTV_SURPLUSterletak di src/glibc-<version>/sysdeps/generic/ldsodefs.h. Anda bisa saja mengubah nomor di baris yang berisi DTV_SURPLUS.
  4. Bangun dengan makepkg -e.
  5. Instal versi khusus dengan sudo pacman -U <package file>. Ini akan menggantikan paket resmi yang diinstal sebelumnya.

Jika Anda tidak ingin mengganti versi yang ada, Anda dapat menggunakan chroot, atau mungkin LD_PRELOAD juga akan berfungsi.

Namun, saya tidak yakin apa yang seharusnya DTV_SURPLUS.

pengguna4098326
sumber