Napisałem wspólną bibliotekę z kilkoma niekompatybilnymi wersjami. Zmieniłem SONAME, więc są one nazywane:Wykryj dwie niezgodne z ABI wersje mojej biblioteki współużytkowanej załadowane do pojedynczego programu
- lib_mylib.so.1.0.0 (starsze biblioteki)
- lib_mylib.so.2.0.0
Istnieją pewne funkcje tylko w myLib. so.1, inne są tylko w mylib.so.2 i wiele funkcji jest wspólnych (ale kilka zmieniło liczbę argumentów)
I obawiam się, że możliwe jest połączenie obu wersji mylib w jedną aplikację, na przykład kiedy sama aplikacja jest duża i składa się z wielu bibliotek. Gdy aplikacja jest częściowo odbudowane, nie może być taka sytuacja:
- Zastosowanie
- app_lib1.so (został zbudowany z mylib.so.1 - pierwsza wersja mojego lib)
- app_lib2.so (przebudowano z mylib.so.2 - druga wersja)
Już widziałem aplikację załadowaną do obu wersji (ldd
zgłasza oba).
Czy istnieje możliwość dodania kodu do pliku mylib.so.2 w celu wykrycia, że są już załadowane obie wersje biblioteki i mają konflikt ABI/Interface. (Nie mogę zmodyfikować biblioteki lib_mylib.so.1, aby dodać coś do niej)
Potrafię tylko parsować '/ proc/self/maps' w konstruktorze mojej biblioteki. Myślę, że jest możliwe, że w momencie uruchomienia mojego konstruktora z drugiej biblioteki, pierwsza biblioteka nie zostanie jeszcze załadowana do pamięci (case 1: mylib2 jest wcześniejsza niż mylib1 na liście bibliotek; case 2: mylib1 zostanie załadowana za pomocą dlopen at jakiś czas później) – osgx