GNU/Linux >> Belajar Linux >  >> Linux

menggunakan RPATH tetapi bukan RUNPATH?

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:

  1. DT_RPATH dalam biner ELF, kecuali DT_RUNPATH disetel.
  2. entri LD_LIBRARY_PATH, kecuali setuid/setgid
  3. DT_RUNPATH dalam biner ELF
  4. /etc/ld.so.cache entri, kecuali -z nodeflib diberikan pada waktu penautan
  5. /lib, /usr/lib kecuali -z nodeflib
  6. Selesai, "tidak ditemukan".

Linux
  1. Jalankan skrip dengan rc.local:skrip berfungsi, tetapi tidak saat boot

  2. Hapus memori bersama posix saat tidak digunakan?

  3. Mengapa kita menggunakan su - dan bukan hanya su?

  1. Mengapa Tidak Menggunakan "yang"? Apa yang Harus Digunakan Lalu?

  2. Linux – Mengapa Kami Menggunakan Su – Dan Bukan Hanya Su?

  3. dd di seluruh disk, tetapi tidak ingin bagian kosong

  1. Bisakah Skrip Dapat Dieksekusi Tetapi Tidak Dapat Dibaca?

  2. Bandingkan Direktori Tapi Bukan Isi File?

  3. Membuka ritsleting File .gz Untuk Mendapatkan File Teks Tetapi Mendapatkan File Biner??