LD LIBRARY PATH
LD_LIBRARY_PATH adalah sebuah environment variable di sistem Linux/Unix yang berisi daftar direktori (dipisah dengan titik dua :) tempat dynamic linker mencari shared library (.so) saat program dijalankan, sebelum linker mengecek lokasi default sistem.
Latar belakang
Program yang di-link secara dinamis tidak menyimpan kode library di dalam binary-nya, melainkan hanya menyimpan nama library yang dibutuhkan. Saat program dijalankan, dynamic linker (misalnya ld-linux.so.2) bertugas mencari dan memuat file .so tersebut ke dalam memori. LD_LIBRARY_PATH memberi cara untuk menyisipkan direktori pencarian tambahan tanpa harus mengubah binary atau konfigurasi sistem.
Karena nilainya bisa diganti setiap kali program dijalankan, variable ini fleksibel untuk testing — berbeda dengan RPATH/RUNPATH yang tertanam permanen di dalam binary saat compile.
Urutan pencarian library
Pada glibc, dynamic linker mencari shared library dengan urutan berikut:
- Library dari
LD_PRELOADdan/etc/ld.so.preload(dimuat lebih dulu, bukan bagian dari pencarian dependency biasa). DT_RPATHdi binary — hanya jika atributDT_RUNPATHtidak ada.LD_LIBRARY_PATH— kecuali binary berstatus setuid/setgid (lihat Keamanan).DT_RUNPATHdi binary (jika ada).- Cache
/etc/ld.so.cache, di-generate olehldconfigdari direktori di/etc/ld.so.conf. - Direktori default sistem:
/liblalu/usr/lib(di-skip jika binary di-link dengan-z nodefaultlib).
Jika library tetap tidak ditemukan di semua lokasi tersebut, muncul error:
error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
Catatan: Poin penting yang sering bikin bingung: kalau binary punya DT_RUNPATH (umum di linker modern dengan --enable-new-dtags), maka DT_RPATH diabaikan dan LD_LIBRARY_PATH dicek sebelum RUNPATH. Tapi kalau yang ada cuma DT_RPATH (gaya lama), maka RPATH dicek sebelum LD_LIBRARY_PATH.
Penggunaan
Set untuk satu sesi shell
export LD_LIBRARY_PATH=/opt/mylibs:$LD_LIBRARY_PATH
./my_program
Set untuk satu kali eksekusi (lebih disarankan)
Cara ini tidak "mengotori" environment shell dan hanya berlaku untuk proses tersebut:
LD_LIBRARY_PATH=/opt/mylibs ./my_program
Beberapa direktori
export LD_LIBRARY_PATH=/opt/cuda/lib64:/usr/local/lib:$LD_LIBRARY_PATH
Kasus penggunaan umum
- Library
.soberada di lokasi non-standar yang belum terdaftar dildconfig. - Menguji library versi baru tanpa meng-install ke sistem (system-wide).
- Workflow GPU/ML — menunjuk ke library vendor seperti
libcudart.so,libnvinfer.so(TensorRT), atau ICD loader OpenCL yang tidak ada di default path.
Keamanan
Untuk binary ber-bit setuid atau setgid, dynamic linker mengabaikan LD_LIBRARY_PATH (dan juga membatasi LD_PRELOAD). Ini disebut secure-execution mode dan mencegah serangan library hijacking, di mana attacker bisa memaksa program istimewa memuat .so jahat.
Beberapa risiko penggunaan sembarangan:
- Konflik versi — binary lain bisa salah memuat
.soversi yang tidak diinginkan. - Degradasi performa — direktori tambahan ikut di-scan untuk semua program yang mewarisi environment tersebut.
- Vektor serangan — jika ada direktori writable oleh user lain di dalam path.
Alternatif yang lebih baik
Untuk solusi permanen, hindari menaruh LD_LIBRARY_PATH di .bashrc. Sebagai gantinya:
- Tambahkan path ke file di
/etc/ld.so.conf.d/*.conflalu jalankansudo ldconfig. - Atau tanamkan
RUNPATHsaat compile menggunakan linker flag:
gcc main.c -o my_program -Wl,-rpath,/opt/mylibs -L/opt/mylibs -lmylib
- Pendekatan
RUNPATHlebih portabel karena path menempel di binary, tidak bergantung pada environment variable. Token khusus$ORIGINbisa dipakai untuk path relatif terhadap lokasi binary, misalnya-Wl,-rpath,'$ORIGIN/../lib'.
Tooling terkait
| Perintah | Fungsi |
|---|---|
ldd ./my_program |
Menampilkan library apa saja yang dibutuhkan dan ke mana resolusinya |
| grep PATH | Melihat RPATH/RUNPATH yang tertanam
|
ldconfig -p |
Menampilkan isi cache /etc/ld.so.cache
|
LD_DEBUG=libs ./my_program |
Men-debug proses pencarian library oleh linker |
patchelf --set-rpath |
Mengubah RPATH/RUNPATH binary yang sudah jadi
|
Lihat pula
- rpath (
DT_RPATH/DT_RUNPATH) LD_PRELOADldconfigld.so
Referensi
- '. ld.so(8) — Linux manual page. https://www.man7.org/linux/man-pages/man8/ld.so.8.html
- Wikipedia. rpath. https://en.wikipedia.org/wiki/Rpath