LD LIBRARY PATH: Difference between revisions
No edit summary Tag: Reverted |
No edit summary Tag: Manual revert |
||
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
{{Infobox | |||
| title = LD_LIBRARY_PATH | |||
| label1 = Tipe | data1 = Environment variable | |||
| label2 = Platform | data2 = Linux / Unix-like (glibc, dll.) | |||
| label3 = Dibaca oleh | data3 = Dynamic linker/loader (<code>ld.so</code> / <code>ld-linux.so</code>) | |||
| label4 = Pemisah | data4 = Titik dua (<code>:</code>) | |||
}} | |||
'''<code>LD_LIBRARY_PATH</code>''' adalah sebuah ''environment variable'' di sistem Linux/Unix yang berisi daftar direktori (dipisah dengan titik dua <code>:</code>) tempat ''dynamic linker'' mencari ''[[shared library]]'' (<code>.so</code>) saat program dijalankan, '''sebelum''' linker mengecek lokasi default sistem. | '''<code>LD_LIBRARY_PATH</code>''' adalah sebuah ''environment variable'' di sistem Linux/Unix yang berisi daftar direktori (dipisah dengan titik dua <code>:</code>) tempat ''dynamic linker'' mencari ''[[shared library]]'' (<code>.so</code>) saat program dijalankan, '''sebelum''' linker mengecek lokasi default sistem. | ||
Latest revision as of 09:33, 18 June 2026
| LD_LIBRARY_PATH | |
|---|---|
| Tipe | Environment variable |
| Platform | Linux / Unix-like (glibc, dll.) |
| Dibaca oleh | Dynamic linker/loader (ld.so / ld-linux.so)
|
| Pemisah | Titik dua (:)
|
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