Comment reconstruire la glibc sur Arch Linux?


8

Il semble que MATLAB soit royalement foutu sous Linux, car il "charge dynamiquement certaines bibliothèques avec TLS statique" , ce qui ne signifie rien pour moi à part que j'obtienne des tas d'erreurs.

Le travail suggéré est de reconstruire glibcavec un plus grand DTV_SURPLUS. Cela me laisse avec deux questions:

  • Comment reconstruire glibcsur Arch Linux pour augmenter le DTV_SURPLUS? J'ai regardé le PKGBUILD dans l'arbre des abdos et DTV_SURPLUSje n'ai vu nulle part, donc je ne sais pas où faire le changement.
  • Quelle valeur dois-je définir DTV_SURPLUS? Vraisemblablement, le définir 2^64serait à la fois exagéré et une mauvaise idée.

Le problème avec MATLAB peut être vu avec le MWE suivant dans 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)

ones(10)*ones(10);charge la libiomp5.sobibliothèque BLAS liée dynamiquement , qui semble ne pas laisser suffisamment d'espace pour le lien dynamique libxul.sorequis pour le navigateur de documentation HTML. Je peux potentiellement contourner ce MWE particulier en utilisant une version corrigée de libiomp5.so, mais le problème général persiste.


Vous feriez probablement mieux de vérifier si une distribution a déjà compilé la glibc avec un DTV_SURPLUS plus élevé - peut-être en testant dans une machine virtuelle.
goldilocks

@goldilocks un chroot suffirait-il ou ai-je besoin d'une VM complète?
StrongBad

J'ai trouvé ceci: stackoverflow.com/questions/19268293/… et ceci: mathworks.com/matlabcentral/answers/… . Une recherche Google après "ne peut plus charger d'objet avec un TLS statique" vous donnera certainement plus d'idées.
schaiba

J'ai lié à la question SO dans ma question et c'est là que l'idée de reconstruction a glibcété suggérée.
StrongBad

Le noyau n'est pas un problème, vous pouvez donc utiliser chroot.
goldilocks

Réponses:


2

Pour recompiler glibc avec personnalisé DTV_SURPLUSet remplacer la version existante:

  1. Copiez /var/abs/core/glibcdans un autre répertoire pour pouvoir y écrire sans être root, puis cddans ce répertoire.
  2. Utilisez makepkg -opour télécharger et extraire le code source sans le construire (car nous éditerons le code source avant de le construire).
  3. Modifier DTV_SURPLUSsitué dans src/glibc-<version>/sysdeps/generic/ldsodefs.h. Vous pouvez simplement changer le nombre dans la ligne contenant DTV_SURPLUS.
  4. Construisez-le avec makepkg -e.
  5. Installez la version personnalisée avec sudo pacman -U <package file>. Cela remplacera le package officiel précédemment installé.

Si vous ne voulez pas remplacer la version existante, vous pouvez utiliser chroot, ou peut-être que LD_PRELOAD fonctionnera également.

Cependant, je ne sais pas ce qui devrait DTV_SURPLUSêtre.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.