Come ricostruire glibc su Arch Linux?


8

Sembra che MATLAB sia stato rovinato in modo regale su Linux, perché "carica dinamicamente alcune librerie con TLS statico" , il che non significa nulla per me se non il fatto di avere un sacco di errori.

Il lavoro suggerito è quello di ricostruire glibccon un più grande DTV_SURPLUS. Questo mi lascia con due domande:

  • Come ricostruire glibcsu Arch Linux per aumentare il DTV_SURPLUS? Ho guardato il PKGBUILD nell'albero degli addominali e non ho visto da DTV_SURPLUSnessuna parte, quindi non so dove apportare la modifica.
  • Quale valore devo impostare DTV_SURPLUS? Presumibilmente, impostarlo su 2^64sarebbe sia eccessivo che una cattiva idea.

Il problema con MATLAB può essere visto con il seguente MWE in 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)

Dove ones(10)*ones(10);carica la libiomp5.solibreria BLAS collegata dinamicamente , che sembra non lasciare abbastanza spazio per il collegamento dinamico libxul.sorichiesto per il browser della documentazione basata su HTML. Potenzialmente posso aggirare questo particolare MWE usando una versione patchata di libiomp5.so, ma il problema generale persiste ancora.


Probabilmente faresti meglio a controllare in giro per vedere se c'è una distro che ha già compilato glibc con un DTV_SURPLUS più alto, forse testando in una VM.
Riccioli d'oro

@goldilocks sarebbe sufficiente un chroot o ho bisogno di una VM completa?
StrongBad

Ho trovato questo: stackoverflow.com/questions/19268293/... e questo: mathworks.com/matlabcentral/answers/... . Una ricerca di Google dopo "Impossibile caricare altri oggetti con TLS statico" è destinata a darti più idee.
schaiba,

Ho collegato alla domanda SO nella mia domanda ed è qui che è glibcstata suggerita l'idea di ricostruire .
StrongBad

Il kernel non è un problema, quindi puoi usare chroot.
Riccioli d'oro

Risposte:


2

Per ricompilare glibc con custom DTV_SURPLUSe sovrascrivere la versione esistente:

  1. Copia /var/abs/core/glibcin un'altra directory in modo da poter scrivere su di essa senza essere root, quindi cdin quella directory.
  2. Utilizzare makepkg -oper scaricare ed estrarre il codice sorgente senza crearlo (perché modificheremo il codice sorgente prima di creare).
  3. Modifica DTV_SURPLUSsituato in src/glibc-<version>/sysdeps/generic/ldsodefs.h. Puoi semplicemente cambiare il numero nella riga contenente DTV_SURPLUS.
  4. Costruiscilo con makepkg -e.
  5. Installa la versione personalizzata con sudo pacman -U <package file>. Ciò sovrascriverà il pacchetto ufficiale precedentemente installato.

Se non vuoi sovrascrivere la versione esistente, puoi usare chroot, o forse LD_PRELOAD funzionerà anche.

Tuttavia, non sono sicuro di cosa dovrebbe DTV_SURPLUSessere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.