Jump to content

LD LIBRARY PATH

From Haidhi Wiki
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:

  1. Library dari LD_PRELOAD dan /etc/ld.so.preload (dimuat lebih dulu, bukan bagian dari pencarian dependency biasa).
  2. DT_RPATH di binary — hanya jika atribut DT_RUNPATH tidak ada.
  3. LD_LIBRARY_PATH — kecuali binary berstatus setuid/setgid (lihat Keamanan).
  4. DT_RUNPATH di binary (jika ada).
  5. Cache /etc/ld.so.cache, di-generate oleh ldconfig dari direktori di /etc/ld.so.conf.
  6. Direktori default sistem: /lib lalu /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 .so berada di lokasi non-standar yang belum terdaftar di ldconfig.
  • 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 .so versi 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/*.conf lalu jalankan sudo ldconfig.
  • Atau tanamkan RUNPATH saat compile menggunakan linker flag:
gcc main.c -o my_program -Wl,-rpath,/opt/mylibs -L/opt/mylibs -lmylib
Pendekatan RUNPATH lebih portabel karena path menempel di binary, tidak bergantung pada environment variable. Token khusus $ORIGIN bisa 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

Referensi