Saya mencoba mempelajari lebih lanjut tentang versi perpustakaan di Linux dan bagaimana menjalankannya. Inilah konteksnya:
- Saya punya dua versi perpustakaan dinamis yang mengekspos set antarmuka yang sama, katakan libsome1.sodan libsome2.so.
- Aplikasi terhubung dengan libsome1.so.
- Aplikasi ini digunakan libdl.sountuk memuat modul lain secara dinamis, katakanlah libmagic.so.
- Sekarang libmagic.soterhubung libsome2.so. Jelas, tanpa menggunakan skrip linker untuk menyembunyikan simbol libmagic.so, pada saat run-time semua panggilan ke antarmuka libsome2.sodiselesaikan libsome1.so. Ini dapat dikonfirmasi dengan memeriksa nilai yang dikembalikan oleh libVersion()terhadap nilai makro LIB_VERSION.
- Jadi saya coba selanjutnya mengkompilasi dan menghubungkan libmagic.sodengan skrip linker yang menyembunyikan semua simbol kecuali 3 yang didefinisikan libmagic.sodan diekspor olehnya. Ini berfungsi ... Atau setidaknya libVersion()dan LIB_VERSIONnilainya cocok (dan ini melaporkan versi 2 bukan 1).
- Namun, ketika beberapa struktur data serial ke disk, saya melihat beberapa korupsi. Dalam direktori aplikasi jika saya menghapus libsome1.sodan membuat tautan lunak di tempatnya untuk menunjuk libsome2.so, semuanya berfungsi seperti yang diharapkan dan korupsi yang sama tidak terjadi.
Saya tidak dapat membantu tetapi berpikir bahwa ini mungkin disebabkan oleh beberapa konflik dalam resolusi simbol run-time linker. Saya sudah mencoba banyak hal, seperti mencoba menautkan libsome2.sosemua simbol yang dinyalakan symbol@@VER_2(yang saya masih bingung karena perintah nm -CD libsome2.somasih mencantumkan simbol sebagai symboldan tidak symbol@@VER_2) ... Sepertinya tidak ada yang berhasil !!! Tolong!!!!!!
RTLD_LOCALdan RTLD_DEEPBINDdlopen bendera di aplikasi Anda. Saya tidak punya waktu untuk menguji ini sekarang tetapi harus bekerja berdasarkan halaman manual.