Saya mengerti bagaimana mendefinisikan sertakan objek yang dibagikan pada waktu penautan/kompilasi. Namun, saya masih bertanya-tanya bagaimana executable mencari objek bersama (*.so
perpustakaan) pada waktu eksekusi.
Misalnya, aplikasi saya a.out
memanggil fungsi yang didefinisikan dalam lib.so
Perpustakaan. Setelah kompilasi, saya memindahkan lib.so
ke direktori baru di $HOME
. saya .
Bagaimana cara mengetahui a.out
untuk pergi mencarinya di sana?
Jawaban yang Diterima:
Pustaka bersama HOWTO menjelaskan sebagian besar mekanisme yang terlibat, dan manual loader dinamis menjelaskan lebih detail. Setiap varian unix memiliki caranya sendiri, tetapi sebagian besar menggunakan format yang dapat dieksekusi (ELF) yang sama dan memiliki tautan dinamis yang serupa¹ (berasal dari Solaris). Di bawah ini saya akan merangkum perilaku umum dengan fokus pada Linux; periksa manual sistem Anda untuk cerita lengkapnya.
(Catatan terminologi:bagian dari sistem yang memuat pustaka bersama sering disebut “dynamic linker”, tetapi terkadang “dynamic loader” lebih tepatnya. “Dynamic linker” juga dapat berarti alat yang menghasilkan instruksi untuk dynamic loader saat kompilasi sebuah program, atau kombinasi alat waktu kompilasi dan loader waktu proses. Dalam jawaban ini, "linker" mengacu pada bagian waktu proses.)
Singkatnya, ketika mencari perpustakaan dinamis (.so
file) penaut mencoba:
- direktori yang terdaftar di
LD_LIBRARY_PATH
variabel lingkungan (DYLD_LIBRARY_PATH
di OSX); - direktori yang terdaftar di rpath yang dapat dieksekusi;
- direktori pada jalur pencarian sistem, yang (setidaknya di Linux) terdiri dari entri di
/etc/ld.so.conf
plus/lib
dan/usr/lib
.
Rpath disimpan dalam executable (ini adalah DT_RPATH
atau DT_RUNPATH
atribut dinamis). Itu dapat berisi jalur absolut atau jalur yang dimulai dengan $ORIGIN
untuk menunjukkan jalur relatif terhadap lokasi executable (misalnya jika executable di /opt/myapp/bin
dan rpath-nya adalah $ORIGIN/../lib:$ORIGIN/../plugins
maka linker dinamis akan terlihat di /opt/myapp/lib
dan /opt/myapp/plugins
). Rpath biasanya ditentukan ketika executable dikompilasi, dengan -rpath
pilihan untuk ld
, tetapi Anda dapat mengubahnya setelah itu dengan chrpath
.
Dalam skenario yang Anda jelaskan, jika Anda adalah pengembang atau pembuat paket aplikasi dan ingin menginstalnya di …/bin
, …/lib
struktur, lalu tautkan dengan -rpath='$ORIGIN/../lib'
. Jika Anda menginstal biner bawaan pada sistem Anda, letakkan pustaka di direktori di jalur pencarian (/usr/local/lib
jika Anda adalah administrator sistem, jika tidak, direktori yang Anda tambahkan ke $LD_LIBRARY_PATH
), atau coba chrpath
.