Binari sendiri mengetahui versi perpustakaan bersama mana yang mereka andalkan, dan memintanya secara khusus. Anda dapat menggunakan ldd
untuk menunjukkan dependensi; milikku untuk ls
adalah:
$ ldd /bin/ls
linux-gate.so.1 => (0xb784e000)
librt.so.1 => /lib/librt.so.1 (0xb782c000)
libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
libc.so.6 => /lib/libc.so.6 (0xb76dc000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
/lib/ld-linux.so.2 (0xb784f000)
libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)
Seperti yang Anda lihat, ini menunjuk ke mis. libpthread.so.0
, bukan hanya libpthread.so
.
Alasan tautan simbolis adalah untuk tautan. Saat Anda ingin menautkan ke libpthread.so
langsung, Anda memberikan gcc
bendera -lpthread
, dan ditambahkan pada lib
awalan dan .so
akhiran secara otomatis. Anda tidak dapat memintanya untuk menambahkan .so.0
sufiks, jadi tautan simbolik mengarah ke versi terbaru lib untuk memfasilitasi itu
Angka-angka di perpustakaan bersama adalah konvensi yang digunakan di Linux untuk mengidentifikasi API perpustakaan. Biasanya formatnya adalah:
libFOO.so.MAJOR.MINOR
Dan seperti yang Anda perhatikan biasanya ada tautan simbolik dari libFOO.so ke libFOO.so.MAJOR.MINOR. ldconfig bertanggung jawab memperbarui tautan ini ke versi terbaru.
UTAMA biasanya bertambah ketika API berubah (titik masuk baru dihapus atau parameter atau tipe diubah). MINOR biasanya ditambahkan untuk rilis perbaikan bug atau saat API baru diperkenalkan tanpa merusak API yang ada.
Diskusi yang lebih luas dapat ditemukan di sini:Membedah pustaka bersama
Pustaka bersama harus diberi versi sesuai dengan skema berikut:
blah.so.X.Y.Z
dimana
- X =rilis ABI tidak kompatibel mundur
- Y =rilis ABI kompatibel mundur
- Z =Perubahan internal saja - tidak ada perubahan pada ABI
Biasanya Anda hanya melihat digit pertama seperti hello.so.1
karena digit pertama adalah satu-satunya hal yang diperlukan untuk mengidentifikasi "versi" pustaka karena semua digit lainnya kompatibel dengan versi sebelumnya.
ldconfig
memelihara tabel perpustakaan bersama apa yang tersedia di sistem dan di mana jalur ke perpustakaan itu ada. Anda dapat memverifikasi ini dengan menjalankan:
ldconfig -p
Saat sebuah paket dibuat untuk sesuatu seperti Red Hat, pustaka bersama yang dipanggil dalam biner akan dicari dan ditambahkan sebagai dependensi paket pada waktu pembuatan RPM. Oleh karena itu, ketika Anda pergi untuk menginstal paket, penginstal akan mencari tahu apakah hello.so.1
diinstal pada sistem dengan mencentang ldconfig
.
Anda dapat melihat dependensi suatu paket dengan melakukan sesuatu seperti:
rpm -qpR hello.rpm
Sistem ini (tidak seperti Windows) memungkinkan beberapa versi dari hello.so
untuk diinstal pada sistem dan digunakan oleh aplikasi yang berbeda secara bersamaan.