Как пересобрать glibc на Arch Linux?

8

Кажется, что MATLAB по-королевски испорчен в Linux, потому что он «динамически загружает некоторые библиотеки со статическим TLS» , что для меня ничего не значит, кроме как я получаю кучу ошибок.

Предлагаемый обходной путь заключается в том, чтобы восстановить glibcс большим DTV_SURPLUS. Это оставляет меня с двумя вопросами:

  • Как мне перестроить glibcна Arch Linux для увеличения DTV_SURPLUS? Я посмотрел на PKGBUILD в дереве абс и нигде не видел DTV_SURPLUS, поэтому не знаю, где внести изменения.
  • Какое значение я должен установить DTV_SURPLUS? Предположительно, его установка была 2^64бы излишней и плохой идеей.

Проблема с MATLAB может быть замечена со следующим MWE в 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);загружает динамически связанную libiomp5.soбиблиотеку BLAS, которая, кажется, не оставляет достаточно места для динамически связанных, libxul.soнеобходимых для браузера документации на основе HTML. Потенциально я могу обойти этот конкретный MWE, используя исправленную версию libiomp5.so, но общая проблема все еще сохраняется.

StrongBad
источник
Возможно, вам лучше проверить, есть ли дистрибутив, в котором glibc уже скомпилирован с более высоким DTV_SURPLUS - возможно, путем тестирования на виртуальной машине.
Златовласка
@goldilocks хватит ли chroot или мне нужна полная виртуальная машина?
StrongBad
Я нашел это: stackoverflow.com/questions/19268293/… и это: mathworks.com/matlabcentral/answers/… . Поиск в Google после «не может больше загружать объект со статическим TLS» обязательно даст вам больше идей.
Щайба
Я связался с вопросом SO в моем вопросе, и именно здесь glibcбыла предложена идея восстановления .
StrongBad
Ядро не проблема, поэтому вы можете использовать chroot.
Златовласка

Ответы:

2

Чтобы перекомпилировать glibc с custom DTV_SURPLUSи переопределить существующую версию:

  1. Скопируйте /var/abs/core/glibcв другой каталог, чтобы вы могли писать в него, не будучи root, затем cdв этот каталог.
  2. Используйте makepkg -oдля загрузки и извлечения исходного кода без его сборки (потому что мы будем редактировать исходный код перед сборкой).
  3. Изменить DTV_SURPLUSнаходится в src/glibc-<version>/sysdeps/generic/ldsodefs.h. Вы можете просто изменить номер в строке, содержащей DTV_SURPLUS.
  4. Постройте это с makepkg -e.
  5. Установите пользовательскую версию с sudo pacman -U <package file>. Это заменит установленный ранее официальный пакет.

Если вы не хотите переопределять существующую версию, вы можете использовать chroot, или, возможно, LD_PRELOAD также подойдет.

Тем не менее, я не уверен, что должно DTV_SURPLUSбыть.

user4098326
источник