Saya sadar bahwa objek yang dibagikan di Linux menggunakan "nomor-nomor", yaitu bahwa berbagai versi objek yang dibagikan diberi ekstensi yang berbeda, misalnya:
example.so.1
example.so.2
Saya mengerti idenya adalah memiliki dua file berbeda sehingga dua versi perpustakaan dapat ada pada suatu sistem (sebagai lawan dari "Neraka DLL" pada Windows). Saya ingin tahu bagaimana ini bekerja dalam praktek? Seringkali, saya melihat bahwa example.so
sebenarnya tautan simbolis ke example.so.2
mana .2
adalah versi terbaru. Lalu bagaimana suatu aplikasi tergantung pada versi yang lebih lama example.so
mengidentifikasinya dengan benar? Apakah ada aturan mengenai nomor apa yang harus digunakan seseorang? Atau ini hanya konvensi? Apakah itu masalahnya, tidak seperti di Windows di mana binari perangkat lunak ditransfer antar sistem, jika suatu sistem memiliki versi yang lebih baru dari objek yang dibagikan, itu ditautkan ke versi yang lebih lama secara otomatis ketika dikompilasi dari sumber?
Saya curiga ini berkaitan dengan ldconfig
tetapi saya tidak yakin bagaimana caranya.
sumber
ldd
memerlukan path lengkap ke executable.=ls
melakukannya di zsh, tapi saya mengubahnya karena tidak semua orang menggunakan shell ituAngka-angka di perpustakaan bersama adalah konvensi yang digunakan di Linux untuk mengidentifikasi API perpustakaan. Biasanya formatnya adalah:
Dan seperti yang Anda perhatikan biasanya ada tautan simbolis dari libFOO.so ke libFOO.so.MAJOR.MINOR. ldconfig bertanggung jawab untuk memperbarui tautan ini ke versi terbaru.
MAJOR biasanya bertambah ketika API berubah (titik masuk baru dihapus atau parameter atau tipe diubah). MINOR biasanya ditambahkan untuk rilis perbaikan bug atau ketika API baru diperkenalkan tanpa melanggar API yang ada.
Diskusi yang lebih luas dapat ditemukan di sini: Membedah perpustakaan bersama
sumber
libFOO.so.MAJOR.MINOR
(jadi tidak pada akhirnya)Pustaka bersama harus diversi versi sesuai dengan skema berikut:
dimana
Biasanya Anda hanya melihat digit pertama seperti
hello.so.1
karena digit pertama adalah satu-satunya hal yang diperlukan untuk mengidentifikasi "versi" perpustakaan karena semua digit lainnya kompatibel dengan mundur.ldconfig
memelihara tabel perpustakaan apa yang tersedia bersama pada suatu sistem dan di mana jalur ke perpustakaan itu ada. Anda dapat memverifikasi ini dengan menjalankan:Ketika sebuah paket dibangun untuk sesuatu seperti Red Hat, pustaka bersama yang dipanggil dalam biner akan dilihat dan ditambahkan sebagai dependensi paket pada waktu pembuatan RPM. Karena itu, ketika Anda pergi untuk menginstal paket, penginstal akan mencari apakah
hello.so.1
diinstal pada sistem dengan memeriksa atau tidakldconfig
.Anda dapat melihat dependensi suatu paket dengan melakukan sesuatu seperti:
Sistem ini (tidak seperti Windows) memungkinkan beberapa versi
hello.so
diinstal pada suatu sistem dan digunakan oleh aplikasi yang berbeda secara bersamaan.sumber
libNAME.so adalah nama file yang digunakan oleh compiler / linker ketika pertama kali mencari perpustakaan yang ditentukan oleh -lNAME. Di dalam file perpustakaan bersama adalah bidang yang disebut SONAME. Bidang ini disetel saat pustaka itu sendiri pertama kali ditautkan ke objek bersama (jadi) oleh proses pembuatan. SONAME ini sebenarnya yang disimpan oleh tautan di dalam executable tergantung pada objek yang dibagikan yang dikaitkan dengannya. Biasanya SONAME adalah dalam bentuk libNAME.so.MAJOR dan diubah kapan saja perpustakaan menjadi tidak kompatibel dengan executable yang ada yang terhubung dengannya dan kedua versi utama perpustakaan dapat tetap diinstal sesuai kebutuhan (meskipun hanya satu yang akan diarahkan untuk pengembangan sebagai libNAME.so) Juga, untuk mendukung peningkatan yang mudah di antara versi kecil dari sebuah perpustakaan, libNAME.so.MAJOR biasanya merupakan tautan ke file seperti libNAME.so.MAJOR.MINOR. Versi minor baru dapat diinstal dan setelah selesai, tautan ke versi minor lama dihancurkan untuk menunjuk ke versi minor baru yang segera memutakhirkan semua eksekusi baru untuk menggunakan pustaka yang ditingkatkan. Juga, lihat jawaban saya untukLinux, GNU GCC, ld, skrip versi dan format biner ELF - Bagaimana cara kerjanya?
sumber