¿Cómo reconstruir glibc en Arch Linux?

8

Parece que MATLAB está realmente jodido en Linux, porque "carga dinámicamente algunas librerías con TLS estático" , lo que no significa nada para mí aparte de que recibo muchos errores.

La solución sugerida es reconstruir glibccon una más grande DTV_SURPLUS. Esto me deja con dos preguntas:

  • ¿Cómo reconstruyo glibcen Arch Linux para aumentar el DTV_SURPLUS? Miré el PKGBUILD en el árbol de abdominales y no vi en DTV_SURPLUSningún lado, así que no sé dónde hacer el cambio.
  • ¿Qué valor configuro DTV_SURPLUSpara ser? Presumiblemente, configurarlo 2^64sería exagerado y una mala idea.

El problema con MATLAB se puede ver con el siguiente MWE en 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)

Donde ones(10)*ones(10);carga la libiomp5.sobiblioteca BLAS vinculada dinámicamente , que parece no dejar suficiente espacio para los enlaces dinámicamente libxul.sonecesarios para el navegador de documentación basado en HTML. Potencialmente, puedo libiomp5.sosolucionar este MWE en particular utilizando una versión parcheada de , pero el problema general aún persiste.

Fuerte
fuente
Probablemente sea mejor que revises para ver si hay una distribución que ya haya compilado glibc con un DTV_SURPLUS más alto, tal vez probando en una VM.
Ricitos
@goldilocks ¿sería suficiente un chroot o necesito una máquina virtual completa?
StrongBad
Encontré esto: stackoverflow.com/questions/19268293/… y esto: mathworks.com/matlabcentral/answers/… . Una búsqueda en Google después de "no puede cargar más objetos con TLS estático" seguramente le dará más ideas.
schaiba
Me vinculé a la pregunta SO en mi pregunta y ahí es donde glibcse sugirió la idea de reconstrucción .
StrongBad
El núcleo no es un problema, por lo que podría usar chroot.
Ricitos

Respuestas:

2

Para recompilar glibc con personalizado DTV_SURPLUSy anular la versión existente:

  1. Copie /var/abs/core/glibca otro directorio para poder escribir en él sin ser root, luego cda ese directorio.
  2. Úselo makepkg -opara descargar y extraer el código fuente sin compilarlo (porque editaremos el código fuente antes de compilar).
  3. Editar DTV_SURPLUSubicado en src/glibc-<version>/sysdeps/generic/ldsodefs.h. Puede cambiar el número en la línea que contiene DTV_SURPLUS.
  4. Construir con makepkg -e.
  5. Instale la versión personalizada con sudo pacman -U <package file>. Esto anulará el paquete oficial previamente instalado.

Si no desea anular la versión existente, puede usar chroot, o tal vez LD_PRELOAD también funcionará.

Sin embargo, no estoy seguro de lo que debería DTV_SURPLUSser.

user4098326
fuente