GNU/Linux >> Belajar Linux >  >> Linux

Di mana Executables Mencari Objek Bersama Saat Runtime?

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 .


Linux
  1. Bagaimana Cara Mencari Kode Keluar Untuk Aplikasi?

  2. Setara dengan “yang mana” untuk Pustaka Bersama?

  3. Di mana Saya Mencari Alasan Penghapusan Paket Dari Repositori Ubuntu?

  1. Apa yang harus dicari di Penyedia Cloud Hosting

  2. C++ Dynamic Shared Library di Linux

  3. Mengunci mekanisme untuk konsistensi memori bersama

  1. Styli.sh adalah Pengubah Wallpaper Desktop Dinamis yang Hebat untuk Linux

  2. Di mana Eclipse mencari eclipse.ini di Linux

  3. Di mana .bashrc untuk root?