Arch Linux에서 glibc를 다시 빌드하는 방법은 무엇입니까?

Arch Linux에서 glibc를 다시 빌드하는 방법은 무엇입니까?

이 것 같다MATLABLinux에서 완전히 망가졌습니다."정적 TLS를 사용하는 일부 라이브러리의 동적 로딩", 많은 오류가 발생한다는 점을 제외하면 나에게는 이해가 되지 않습니다.

glibc제안된 해결 방법은 더 큰 것을 사용하는 것입니다 DTV_SURPLUS. 이로 인해 두 가지 질문이 남습니다.

  • glibc증가시키기 위해 Arch Linux에서 재구축하는 방법은 무엇입니까 DTV_SURPLUS? PKGBUILD에 대한 ABS 트리를 보았지만 DTV_SURPLUS어디에도 표시되지 않아 어디에서 변경해야 할지 모르겠습니다.
  • 어떤 값으로 설정해야 합니까 DTV_SURPLUS? 아마도 이것을 설정하는 것은 2^64과잉이고 나쁜 생각입니다.

MATLAB의 문제는 R2014a의 다음 MWE에서 확인할 수 있습니다.

>> 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);동적으로 링크된 BLAS 라이브러리가 로드되는데 , libiomp5.so이는 libxul.soHTML 기반 문서 브라우저에 필요한 동적 링크를 위한 충분한 공간을 남겨두지 않는 것 같습니다. 패치 버전을 사용하여 이 특정 MWE를 해결할 수 있었지만 libiomp5.so일반적인 문제는 여전히 남아 있습니다.

답변1

glibc를 사용자 정의 버전으로 다시 컴파일 DTV_SURPLUS하고 기존 버전을 덮어쓰려면 다음을 수행하십시오.

  1. /var/abs/core/glibc루트가 되지 않고도 쓸 수 있도록 다른 디렉터리에 복사한 다음 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그러나 그것이 무엇인지 잘 모르겠습니다 .

관련 정보