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.so
dan libsome2.so
.
- Aplikasi terhubung dengan libsome1.so
.
- Aplikasi ini digunakan libdl.so
untuk memuat modul lain secara dinamis, katakanlah libmagic.so
.
- Sekarang libmagic.so
terhubung libsome2.so
. Jelas, tanpa menggunakan skrip linker untuk menyembunyikan simbol libmagic.so
, pada saat run-time semua panggilan ke antarmuka libsome2.so
diselesaikan 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.so
dengan skrip linker yang menyembunyikan semua simbol kecuali 3 yang didefinisikan libmagic.so
dan diekspor olehnya. Ini berfungsi ... Atau setidaknya libVersion()
dan LIB_VERSION
nilainya 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.so
dan 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.so
semua simbol yang dinyalakan symbol@@VER_2
(yang saya masih bingung karena perintah nm -CD libsome2.so
masih mencantumkan simbol sebagai symbol
dan tidak symbol@@VER_2
) ... Sepertinya tidak ada yang berhasil !!! Tolong!!!!!!
RTLD_LOCAL
dan RTLD_DEEPBIND
dlopen bendera di aplikasi Anda. Saya tidak punya waktu untuk menguji ini sekarang tetapi harus bekerja berdasarkan halaman manual.