Saat Anda mengirim biner, sebaiknya berikan sarana bagi pengguna untuk mengakomodasi biner ke spesifikasi sistem mereka sendiri, antara lain, menyesuaikan jalur penelusuran pustaka.
Seorang pengguna umumnya dapat men-tweak LD_LIBRARY_PATH
dan /etc/ld.so.conf
, keduanya dengan prioritas lebih rendah dari DT_RPATH
, yaitu Anda tidak dapat mengesampingkan apa yang di-hardcode dalam biner, sedangkan jika Anda menggunakan DT_RUNPATH
sebagai gantinya, pengguna dapat menimpanya dengan LD_LIBRARY_PATH
.
(FWIW, saya pikir ld.so.conf
juga harus diutamakan daripada DT_RUNPATH
, tapi setidaknya kita punya LD_LIBRARY_PATH
).
Juga, saya sangat tidak setuju dengan saran di atas untuk menggunakan DT_RPATH
. IMO, yang terbaik adalah menggunakan DT_RPATH
bukan DT_RUNPATH
dalam binari yang dikirim.
kecuali
Anda mengirimkan semua perpustakaan dependen Anda dengan executable Anda dan ingin memastikan bahwa hal-hal JustWork(tm) setelah instalasi, dalam hal ini gunakan DT_RPATH
.
Tetapi mengapa RPATH tidak digunakan lagi dan diganti dengan RUNPATH?
Saat DT_RPATH diperkenalkan, parameter ini memiliki prioritas di atas semua parameter lainnya. Hal ini tidak memungkinkan untuk mengganti jalur pencarian perpustakaan bahkan untuk tujuan pengembangan. Oleh karena itu, parameter lain, LD_RUNPATH, diperkenalkan yang memiliki prioritas lebih rendah daripada LD_LIBRARY_PATH.
Detail selengkapnya dapat ditemukan di karya "Cara menulis perpustakaan bersama" yang ditulis oleh Ulrich Drepper .
Jawaban Chill benar sekali; Saya hanya ingin menambahkan beberapa warna, dari pembacaan sumber glibc baru-baru ini ([master 8b0ccb2], di 2.17). Untuk lebih jelasnya, jika perpustakaan tidak ditemukan di lokasi yang ditentukan oleh level tertentu, level berikutnya dicoba. Jika perpustakaan ditemukan pada tingkat tertentu, pencarian akan berhenti.
Urutan Penelusuran Perpustakaan Dinamis:
- DT_RPATH dalam biner ELF, kecuali DT_RUNPATH disetel.
- entri LD_LIBRARY_PATH, kecuali setuid/setgid
- DT_RUNPATH dalam biner ELF
- /etc/ld.so.cache entri, kecuali -z nodeflib diberikan pada waktu penautan
- /lib, /usr/lib kecuali -z nodeflib
- Selesai, "tidak ditemukan".