Làm cách nào để xây dựng lại glibc trên Arch Linux?


8

Có vẻ như MATLAB thực sự gây rắc rối cho Linux, bởi vì nó "tải động một số lib bằng TLS tĩnh" , điều này không có nghĩa gì với tôi ngoài việc tôi gặp phải hàng loạt lỗi.

Các công việc được đề xuất xung quanh là để xây dựng lại glibcvới một lớn hơn DTV_SURPLUS. Điều này cho tôi hai câu hỏi:

  • Làm cách nào để xây dựng lại glibctrên Arch Linux để tăng DTV_SURPLUS? Tôi đã nhìn PKGBUILD trong cây abs và không thấy ở DTV_SURPLUSđâu cả, vì vậy tôi không biết phải thay đổi ở đâu.
  • Giá trị nào tôi đặt DTV_SURPLUSlà? Có lẽ, thiết lập nó 2^64sẽ là quá mức cần thiết và một ý tưởng tồi.

Vấn đề với MATLAB có thể được nhìn thấy với MWE sau trong 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)

Khi ones(10)*ones(10);tải libiomp5.sothư viện BLAS được liên kết động , dường như không còn đủ dung lượng cho liên kết động được libxul.soyêu cầu cho trình duyệt tài liệu dựa trên HTML. Có khả năng tôi có thể làm việc xung quanh MWE cụ thể này bằng cách sử dụng một phiên bản vá của libiomp5.so, nhưng vấn đề chung vẫn còn tồn tại.


Có lẽ bạn nên kiểm tra xung quanh để xem liệu có một bản phân phối nào đã được biên dịch với DTV_SURPLUS cao hơn không - có lẽ bằng cách thử nghiệm trong VM.
goldilocks

@goldilocks một chroot là đủ hay tôi cần một VM đầy đủ?
StrongBad

Tôi tìm thấy cái này: stackoverflow.com/questions/19268293/ và cái này: mathworks.com/matlabcentral/answers/ trộm . Một tìm kiếm Google sau khi "không thể tải thêm bất kỳ đối tượng nào có TLS tĩnh" bị ràng buộc để cung cấp cho bạn thêm ý tưởng.
schaiba

Tôi đã liên kết với câu hỏi SO trong câu hỏi của tôi và đó là nơi mà ý tưởng xây dựng lại glibcđược đề xuất.
StrongBad

Kernel không phải là vấn đề nên bạn có thể sử dụng chroot.
goldilocks

Câu trả lời:


2

Để biên dịch lại glibc với tùy chỉnh DTV_SURPLUSvà ghi đè phiên bản hiện có:

  1. Sao chép /var/abs/core/glibcvào thư mục khác để bạn có thể ghi vào thư mục đó mà không cần root, sau đó cdvào thư mục đó.
  2. Sử dụng makepkg -ođể tải xuống và trích xuất mã nguồn mà không cần xây dựng nó (vì chúng tôi sẽ chỉnh sửa mã nguồn trước khi xây dựng).
  3. Chỉnh sửa DTV_SURPLUSnằm trong src/glibc-<version>/sysdeps/generic/ldsodefs.h. Bạn chỉ có thể thay đổi số trong dòng chứa DTV_SURPLUS.
  4. Xây dựng nó với makepkg -e.
  5. Cài đặt phiên bản tùy chỉnh với sudo pacman -U <package file>. Điều này sẽ ghi đè gói chính thức được cài đặt trước đó.

Nếu bạn không muốn ghi đè phiên bản hiện tại, bạn có thể sử dụng chroot hoặc có thể LD_PRELOAD cũng sẽ hoạt động.

Tuy nhiên, tôi không chắc nên làm gì DTV_SURPLUS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.