Đây là kịch bản tôi đang có:Chroot ảnh hưởng đến liên kết động như thế nào?
Tôi đã tạo môi trường debootstrap ubuntu maverick (64-bit). Tôi đặt nó ở /env/mav/
trên hệ thống ubuntu (64-bit) sáng suốt của tôi. Tôi có thể chroot
vào /env/mav
và có thể sử dụng hệ thống maverick một cách hoàn hảo.
Tôi thậm chí có thể sử dụng các chương trình sáng suốt bên ngoài môi trường chroot. Đó là /env/mav/bin/ls
sẽ chạy.
Tuy nhiên, tôi nhận thấy rằng nếu tôi sửa đổi LD_LIBRARY_PATH
là /env/mav/lib
[1] [2]
mọi chương trình duy nhất (cả sáng suốt và Maverick) Tôi chạy sẽ sụp đổ ngay lập tức. (ví dụ: kết quả ls trong một segfault). kern.log cho thấy:
segfault at 7fece284aa18 ip 00007fece284aa18 sp 00007fff32028158 error 15
Tuy nhiên, rõ ràng nếu tôi chroot
vào /env/mav
, mọi chương trình đang chạy tốt. Và không phải tất cả các thư viện chỉ được đọc từ nhà tù (/env/mav
) /lib
? Vì vậy, sự khác biệt giữa chroot
và sửa đổi LD_LIBRARY_PATH
trong ngữ cảnh này là gì?
Hơn nữa, nếu tôi:
mount -B /env /env/mav/env
và sau đó chroot /env
và sau đó thiết lập LD_LIBRARY_PATH
là /env/mav/lib
, mọi thứ vẫn chạy tốt.
Tôi không hài lòng với những gì đang diễn ra ở đây. Có một số nội bộ ld được lưu trữ ở đâu đó? Chroot có làm điều gì đó huyền diệu không?
[1] Trường hợp sử dụng là chạy các chương trình từ môi trường maverick bị ràng buộc chính xác tới các thư viện được liên kết động với maverick bên ngoài nhà tù maverick.
[2] Đây chỉ là một ví dụ tóm tắt. Trong thực tế, /usr/lib
, v.v ... đều được bao gồm. Bao gồm cả các chất độc của môi trường/lib "chất độc" tất cả mọi thứ; không có vấn đề gì khi sử dụng các thư mục maverick khác.
Cảm ơn bạn đã giải thích về cách hệ thống liên kết linux hoạt động. Làm việc hoàn hảo. – UsAaR33
Hóa ra sự cố xảy ra với việc liên kết libpthread.so với libc.so (sử dụng LD_DEBUG). Cần lưu ý đến những người trong tương lai, ld.so --list, cho phép bạn làm ldd với những người liên kết khác nhau. – UsAaR33