Các chia sẻ HOWTO thư viện giải thích hầu hết các cơ chế liên quan, và các bộ nạp thủ công động đi vào chi tiết hơn. Mỗi biến thể unix có cách riêng, nhưng hầu hết sử dụng cùng định dạng thực thi ( ELF ) và có các trình liên kết động tương tự (có nguồn gốc từ Solaris). Dưới đây tôi sẽ tóm tắt các hành vi phổ biến với trọng tâm là Linux; kiểm tra hướng dẫn sử dụng hệ thống của bạn để biết câu chuyện hoàn chỉnh.
Tóm lại, khi tìm kiếm một thư viện động ( .so
tệp), trình liên kết sẽ thử:
- các thư mục được liệt kê trong
LD_LIBRARY_PATH
biến môi trường ( DYLD_LIBRARY_PATH
trên OSX);
- các thư mục được liệt kê trong rpath thực thi ;
- các thư mục trên đường dẫn tìm kiếm hệ thống, mà (ít nhất là trên Linux) bao gồm các mục
/etc/ld.so.conf
cộng /lib
và /usr/lib
.
Đường dẫn được lưu trữ trong tệp thực thi ( thuộc tính động DT_RPATH
hoặc DT_RUNPATH
thuộc tính động). Nó có thể chứa các đường dẫn hoặc đường dẫn tuyệt đối bắt đầu $ORIGIN
để chỉ ra một đường dẫn liên quan đến vị trí của tệp thực thi (ví dụ: nếu tệp thực thi nằm trong /opt/myapp/bin
và đường dẫn của nó là $ORIGIN/../lib:$ORIGIN/../plugins
thì trình liên kết động sẽ nhìn vào /opt/myapp/lib
và /opt/myapp/plugins
). Thông thường rpath được xác định khi thực thi được biên dịch, với -rpath
tùy chọn này ld
, nhưng bạn có thể thay đổi nó sau đó chrpath
.
Trong kịch bản mà bạn mô tả, nếu bạn là nhà phát triển hoặc đóng gói của ứng dụng và có ý định cho nó được cài đặt trong một …/bin
, …/lib
kết cấu, sau đó liên kết với -rpath='$ORIGIN/../lib'
. Nếu bạn đang cài đặt nhị phân dựng sẵn trên hệ thống của mình, hãy đặt thư viện vào một thư mục trên đường dẫn tìm kiếm ( /usr/local/lib
nếu bạn là quản trị viên hệ thống, nếu không là thư mục bạn thêm vào $LD_LIBRARY_PATH
) hoặc thử chrpath
.
/lib64
và/usr/lib64
được sử dụng cho các nhị phân 64 bit/lib
và/usr/lib
được sử dụng cho các nhị phân 32 bit.