Wiem, że współdzielone obiekty pod Linuksem używają „więc liczb”, a mianowicie, że różne wersje współdzielonego obiektu mają różne rozszerzenia, na przykład:
example.so.1
example.so.2
Rozumiem, że chodzi o to, aby mieć dwa różne pliki, tak aby dwie wersje biblioteki mogły istnieć w systemie (w przeciwieństwie do „DLL Hell” w systemie Windows). Chciałbym wiedzieć, jak to działa w praktyce? Często widzę, że example.so
jest w rzeczywistości dowiązaniem do example.so.2
gdzie .2
jest najnowsza wersja. Jak zatem aplikacja w zależności od starszej wersji example.so
poprawnie ją identyfikuje? Czy istnieją jakieś zasady dotyczące tego, jakich liczb należy używać? Czy jest to po prostu konwencja? Czy w przeciwieństwie do systemu Windows, w którym binarne oprogramowanie jest przesyłane między systemami, jeśli system ma nowszą wersję obiektu współużytkowanego, jest on automatycznie łączony ze starszą wersją podczas kompilacji ze źródła?
Podejrzewam, że jest to związane, ldconfig
ale nie jestem pewien jak.
źródło
ldd
wymaga pełnej ścieżki do pliku wykonywalnego.=ls
robi to w Zsh, ale zmieniłem to, ponieważ nie wszyscy używają tej powłokiLiczby we współdzielonych bibliotekach są w Linuksie konwencją używaną do identyfikacji API biblioteki. Zazwyczaj format to:
I jak zauważyłeś, zwykle istnieje symboliczny link z libFOO.so do libFOO.so.MAJOR.MINOR. ldconfig jest odpowiedzialny za aktualizację tego linku do najnowszej wersji.
KIERUNEK jest zwykle zwiększany, gdy zmienia się interfejs API (nowe punkty wejścia są usuwane lub zmieniane są parametry lub typy). Wartość MINOR jest zwykle zwiększana w przypadku wydań poprawek błędów lub gdy nowe interfejsy API są wprowadzane bez uszkodzenia istniejących interfejsów API.
Bardziej szczegółową dyskusję można znaleźć tutaj: Analiza wspólnych bibliotek
źródło
libFOO.so.MAJOR.MINOR
(tak nie na końcu)Biblioteki współdzielone powinny być wersjonowane zgodnie z następującym schematem:
gdzie
Zazwyczaj widzisz tylko pierwszą cyfrę,
hello.so.1
ponieważ pierwsza cyfra jest jedyną rzeczą potrzebną do zidentyfikowania „wersji” biblioteki, ponieważ wszystkie pozostałe cyfry są kompatybilne wstecz.ldconfig
utrzymuje tabelę bibliotek współdzielonych dostępnych w systemie i miejsca, w którym istnieje ścieżka do tej biblioteki. Możesz to sprawdzić, uruchamiając:Kiedy pakiet jest budowany dla czegoś takiego jak Red Hat, biblioteki współdzielone wywoływane w pliku binarnym zostaną wyszukane i dodane jako zależności pakietu w czasie kompilacji RPM. Dlatego po przejściu do instalacji pakietu instalator sprawdzi, czy
hello.so.1
system jest zainstalowany, czy nieldconfig
.Możesz zobaczyć zależności pakietu, wykonując coś takiego:
Ten system (w przeciwieństwie do systemu Windows) pozwala na
hello.so
zainstalowanie wielu wersji tego systemu i korzystanie z niego przez różne aplikacje jednocześnie.źródło
libNAME.so to nazwa pliku używana przez kompilator / linker przy pierwszym poszukiwaniu biblioteki określonej przez -lNAME. Wewnątrz pliku biblioteki współdzielonej znajduje się pole o nazwie SONAME. To pole jest ustawiane, gdy sama biblioteka jest najpierw łączona z obiektem współdzielonym (a więc) przez proces kompilacji. Ten SONAME jest tak naprawdę tym, co linker przechowuje w pliku wykonywalnym, w zależności od tego, jaki obiekt współdzielony jest z nim połączony. Zwykle SONAME ma postać libNAME.so.MAJOR i jest zmieniany za każdym razem, gdy biblioteka staje się niezgodna z istniejącymi połączonymi z nią plikami wykonywalnymi, a obie główne wersje biblioteki mogą być instalowane w razie potrzeby (choć tylko jedna będzie wskazywana do programowania jako libNAME.so) Ponadto, aby ułatwić łatwą aktualizację między mniejszymi wersjami biblioteki, libNAME.so.MAJOR jest zwykle linkiem do pliku takiego jak libNAME.so.MAJOR.MINOR. Można zainstalować nową wersję podrzędną, a po jej ukończeniu odsyłacz do starej wersji podrzędnej zostanie podbity, aby wskazać nową wersję podrzędną, która natychmiast aktualizuje wszystkie nowe wykonania w celu korzystania z zaktualizowanej biblioteki. Zobacz także moją odpowiedź naLinux, GNU GCC, ld, skrypty wersji i format binarny ELF - jak to działa?
źródło