Sử dụng libc thay thế với hack ld-linux.so; Phương pháp nào sạch hơn?


13

Tôi có một hệ thống kế thừa với một glibc rất cũ, chúng tôi không thể nâng cấp mà không phải chịu một loạt công việc kiểm tra / xác nhận.

Tôi đã cần phải chạy các chương trình mới hơn (như Java 1.7) trên hệ thống đó nhiều lần. Tôi đã chọn một giải pháp chroot, nơi tôi gói tất cả các lib cần thiết và chạy một dịch vụ trong một chroot.

Mặc dù vậy, chroot rất hạn chế và tôi muốn thử giải quyết vấn đề với LD_LIBRARY_PATH. Thật không may, tôi nhận được một lỗi về libc.so.6: cannot handle TLS datakhi tôi thử điều đó.

Hóa ra tôi cũng cần /lib/ld-linux.so.2từ chroot. Những công việc này:

LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program

Tuy nhiên, thực hiện javathủ thuật của tôi bằng cách kiểm tra /proc/self/cmdlineđể xác định nơi tải thư viện của nó, điều này không thành công nếu nhị phân không được đặt tên là 'bin / java'. Ngoài ra java thực thi chính nó trong khi khởi động, vấn đề phức tạp hơn nữa.

Trong lần thử cuối cùng để thực hiện công việc này, tôi đã mở tệp nhị phân java bằng trình soạn thảo hex và thay thế chuỗi /lib/ld-linux.so.2bằng /home/chroot/ld.so(và làm cho nó trở thành một liên kết tượng trưng ld-linux.so.2) và nó đã hoạt động!

Nhưng tôi nghĩ mọi người sẽ đồng ý rằng đó là một khối lượng lớn để viết lại đường dẫn của mọi nhị phân mới đến một đường dẫn tuyệt đối của hệ thống lồng nhau.

Có ai biết một cách sạch hơn để sử dụng đường dẫn thư viện tùy chỉnh bao gồm ld-linux.so tùy chỉnh không?

Câu trả lời:


12

Đường dẫn đến trình tải được biên dịch thành nhị phân như bạn đã khám phá với trình soạn thảo hex của mình. Bạn thực sự đã may mắn khi chỉnh sửa nhị phân trực tiếp làm việc vì cả hai /lib/ld-linux.so.2/home/chroot/ld.socó cùng độ dài. Độ dài của các chuỗi đó cũng nằm trong hệ nhị phân và bạn có thể gây ra sự cố tinh vi nếu bạn sửa đổi trực tiếp chuỗi.

Nếu bạn kết thúc việc đi theo lộ trình, bạn nên xem một số thứ như patchelf để cập nhật trình thông dịch. Điều này sẽ cho phép bạn thay đổi vĩnh viễn trình thông dịch một cách nhanh chóng và an toàn.


Không phải là may mắn, tôi biết rằng tôi cần phải thay đổi bất kỳ byte nào ;-) Nhưng, bản thân nó trông giống như những gì tôi muốn. Ngoài việc không thể sử dụng một đường dẫn tương đối, nó cũng có thể chăm sóc LD_LIBRARY_PATH Tôi đang sử dụng để tôi không cần trình bao bọc. Tôi sẽ cung cấp cho bạn tín dụng cho câu trả lời ngay khi tôi có cơ hội kiểm tra nó.
dataless

1
Nó hoạt động! Điều này sẽ cho tôi một con đường tốt để chuyển tiếp các chương trình libc mới với các chương trình libc cũ trên máy chủ này. Đối với những độc giả tương lai, lệnh là patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java, trong đó $ JAVA là thư mục của JRE và là nơi tôi đã làm tròn tất cả các thư viện phụ thuộc và đặt chúng vào lib/thư mục của JRE.
dataless

@dataless cũng tôi vẫn cần LD_LIBRARY_PATH để workaround libjvm.so này, bởi vì libstdc ++ so.6: không thể mở được chia sẻ tập tin đối tượng: Không có tập tin hoặc thư mục [root @ 97245bbe7cc1 tensorflow-java] #.
Amos

@Amos Đã được một thời gian, nhưng đối với trường hợp của tôi, tôi không cần LD_LIBRARY_PATH nữa vì mặc định đến từ tệp nhị phân java. Nhưng, lưu ý phần mà tôi đã nói rằng tôi đã đi khắp nơi và tìm thấy tất cả các lib được java sử dụng và sao chép chúng vào java lib dir. Tôi đã sử dụng ldd $JAVA/bin/javađể có được ist. Ngoài ra còn có một số động libc những người bạn cần thích libnss.so
dataless
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.