Próbuję dowiedzieć się więcej o wersjonowaniu bibliotek w systemie Linux i o tym, jak to wszystko uruchomić. Oto kontekst:
- Mam dwie wersje biblioteki dynamicznej, która udostępnia ten sam zestaw interfejsów, powiedzmy libsome1.so
i libsome2.so
.
- Aplikacja jest połączona z libsome1.so
.
- Ta aplikacja używa libdl.so
do dynamicznego ładowania innego modułu, powiedzmy libmagic.so
.
- Teraz libmagic.so
jest powiązany z libsome2.so
. Oczywiście, bez użycia skryptów linkera do ukrywania symboli libmagic.so
, w czasie wykonywania wszystkie wywołania interfejsów libsome2.so
są przetwarzane libsome1.so
. Można to potwierdzić, porównując wartość zwracaną przez libVersion()
z wartością makra LIB_VERSION
.
- Więc próbuję następnie skompilować i połączyć libmagic.so
ze skryptem linkera, który ukrywa wszystkie symbole oprócz 3, które są w nim zdefiniowane libmagic.so
i są przez niego eksportowane. To działa ... albo przynajmniej libVersion()
i LIB_VERSION
wartości dopasowania (i zgłasza wersji 2 nie 1).
- Jednak gdy niektóre struktury danych są serializowane na dysk, zauważyłem pewne uszkodzenie. Jeśli w katalogu aplikacji usunę libsome1.so
i utworzę miękki link w jego miejscu, aby wskazać libsome2.so
, wszystko działa zgodnie z oczekiwaniami i takie samo uszkodzenie nie występuje.
Nie mogę przestać myśleć, że może to być spowodowane konfliktem w rozdzielczości symboli łącznika w czasie wykonywania. Próbowałem wielu rzeczy, takich jak próba połączenia libsome2.so
, aby wszystkie symbole były wyrównane symbol@@VER_2
( do czego wciąż jestem zdezorientowany, ponieważ polecenie nm -CD libsome2.so
nadal wyświetla symbole jako symbol
i nie symbol@@VER_2
) ... Wydaje się, że nic nie działa !!! Wsparcie!!!!!!
RTLD_LOCAL
i RTLD_DEEPBIND
dlopen w swojej aplikacji. Nie mam teraz czasu na testowanie tego, ale powinno działać w oparciu o stronę podręcznika.