Java JDK thiếu đường dẫn libjli.so trong danh sách phụ thuộc, Debian


8

Tôi đang lên kịch bản cho việc tạo ra các nhà tù chroot và một phần của tự động hóa đó bao gồm sao chép các thực thi khác nhau và sự phụ thuộc của chúng vào nhà tù. Tôi đang sử dụng dòng bash sau đây để phân tích các đường dẫn tệp ra khỏi danh sách các phụ thuộc (ví dụ như java):

$ ldd `which java` | grep -o '/[^()]*'
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

Điều này hoạt động rất tốt cho Node.js và Python, nhưng khi tôi cố gắng thực thi javatừ bên trong nhà tù, tôi gặp lỗi:

java: lỗi trong khi tải thư viện dùng chung: libjli.so: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy

Nó chỉ ra rằng đường dẫn libjli.so bị thiếu trong danh sách các phụ thuộc ... ít nhất là các đường dẫn lddhiển thị cho chúng tôi (dòng 5):

$ ldd `which java`
linux-vdso.so.1 =>  (0x00007ffff7f4d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7ac3928000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ac370c000)
libjli.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ac3507000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ac317c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ac3b48000)

Tôi tìm thấy tập tin ...

$ find /usr/lib -name libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli/libjli.so

... nhưng tôi muốn biết tại sao nó không được liệt kê ldd. Đó là một sự phụ thuộc được biết rõ ràng, nhưng con đường không rõ? Bất kỳ trợ giúp được đánh giá cao!


Câu hỏi thú vị, Bạn có thể thử hỏi điều này trên một diễn đàn openjdk.
Faheem Mitha

Trong trường hợp ai đó vấp phải điều này từ google: có vẻ như nó có thể là một bản sao với unix.stackexchange.com/questions/16656 , có nhiều thông tin hơn (và các câu trả lời khác nhau).
yshavit 6/2/2015

Câu trả lời:


7

Nó được cho là hoạt động tốt - không gây rối với /etc/ld.so.conf* hoặc ldconfig - và nó có thể dễ dàng làm như vậy. Chỉ cần gắn kết / Proc trong chroot của bạn. Tôi làm điều này với dòng sau trong / etc / fstab trong fs gốc của tôi:

/ Proc / var / chroot / ia32 / Proc không ràng buộc

Do đó ràng buộc nó với thực / Proc.

Mỗi https://github.com/cedric-vincent/PRoot/issues/9 , ld-linux.so (tôi đoán là vậy) xác định $ ORIGIN để thay thế các mục RPATH của objdump -p bằng cách xem / Proc / self / exe

Đã bao nhiêu lần tôi bị cắn bởi điều này và phải khám phá lại nó? Làm ơn, ôi Google vĩ đại và khôn ngoan, hãy nhanh chóng đưa tôi trở lại đây vào lần tới, để tương lai tôi có thể học lại ở đầu gối của tôi!


1
Cảm ơn. Điểm của bạn /proc/self/exelà đầu mối bị mất ở phía tôi. Gắn kết /proctrong chroot của tôi đã làm điều đó.
Tino

3

Có vẻ như bạn cần thêm

/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli

đến /etc/ld.so.conf hoặc nhiều khả năng là một tệp mới trong /etc/ld.so.conf.d. Sau đó chạy ldconfigđể cập nhật bộ đệm nên lddsẽ tìm thư viện.

Đối với các đoạn mã kịch bản, về lâu dài, bạn sẽ ít phải chịu một cách tiếp cận dựa trên gói, tạo cài đặt cơ sở trước tiên (sử dụng debootstrap trên các máy chủ dựa trên Debian), sau đó cài đặt các gói bạn muốn. Điều đó cho phép người quản lý gói đảm nhiệm tất cả các công việc giải quyết các phụ thuộc, cài đặt tất cả các tệp cần thiết và chạy các tác vụ sau khi cài đặt.


Và bạn có thể cho tôi biết lý do tại sao nó không có trong ld.so.conf hoặc một trong các tệp được bao gồm không? Hệ điều hành có nên đặt nó ở đó trong khi cài đặt không?
Rip Leeb

Không, tôi không biết điều đó. Tôi có thể nói rằng tôi thấy kết quả tương tự trên máy chủ Ubuntu 14.04 của mình và java vẫn khởi động tốt. Vì vậy, nó phải được giải quyết một cách linh hoạt trong thời gian chạy.
Andrew Schulman
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.