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.soi libsome2.so.
- Aplikacja jest połączona z libsome1.so.
- Ta aplikacja używa libdl.sodo dynamicznego ładowania innego modułu, powiedzmy libmagic.so.
- Teraz libmagic.sojest 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.sosą 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.soze skryptem linkera, który ukrywa wszystkie symbole oprócz 3, które są w nim zdefiniowane libmagic.soi są przez niego eksportowane. To działa ... albo przynajmniej libVersion()i LIB_VERSIONwartoś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.soi 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.sonadal wyświetla symbole jako symboli nie symbol@@VER_2) ... Wydaje się, że nic nie działa !!! Wsparcie!!!!!!
RTLD_LOCALi RTLD_DEEPBINDdlopen w swojej aplikacji. Nie mam teraz czasu na testowanie tego, ale powinno działać w oparciu o stronę podręcznika.