Mam binarny plik wykonywalny o nazwie „alpha”, który wymaga połączonej biblioteki (libz.so.1.2.7), która jest umieszczona w /home/username/myproduct/lib/libz.so.1.2.7
Eksportuję to samo do mojej instancji terminala przed spawnem mojego binarnego pliku wykonywalnego, wykonując następujące polecenie.
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
Teraz, gdy odradzam inną aplikację „brawo”, która wymaga tej samej biblioteki, ale innej wersji, tj. (Libz.so.1.2.8), która jest dostępna w
/lib/x86_64-linux-gnu/libz.so.1.2.8
systemie, system generuje następujący błąd.
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
Jeśli wyłączę LD_LIBRARY_PATH
, „brawo” zacznie się dobrze. Rozumiem, że powyższe zachowanie jest LD_LIBRARY_PATH
nadrzędne, ponieważ ma pierwszeństwo przed ścieżkami katalogu zdefiniowanymi /etc/ld.so.conf
podczas wyszukiwania bibliotek połączonych, w wyniku czego wystąpił powyższy błąd. Jestem tylko ciekawy, dlaczego programiści UNIX / LINUX nie zaprojektowali systemu operacyjnego do wyszukiwania bibliotek połączonych w innych katalogach zgodnie z hierarchią, jeśli pierwsza instancja biblioteki ma inną wersję.
Mówiąc najprościej, systemy UNIX / LINUX przechodzą przez zestaw katalogów, aż znajdzie wymaganą bibliotekę. Ale dlaczego nie robi tego samego, dopóki nie znajdzie oczekiwanej wersji, zamiast zaakceptować pierwszą instancję biblioteki niezależnie od jej wersji?
źródło
libz.so.1
jest dowiązaniem symbolicznym dolibz.so.1.2.8
Odpowiedzi:
Tak, o ile jest to świadome.
zlib.so.1.2.7
izlib.so.1.2.8
oba mają sonamezlib.so.1
, więc twojaalpha
ibravo
binaria mówią, że potrzebujązlib.so.1
. Dynamiczny moduł ładujący ładuje pierwszą znalezioną bibliotekę; nie wie, że wersja 1.2.8 zapewnia dodatkowe symbole, którebravo
potrzebują. (Właśnie dlatego dystrybucje starają się określić dodatkowe informacje o zależnościach, takie jakzlib1g (>= 1.2.8)
dlabravo
.)Można by pomyśleć, że powinno to być łatwe do naprawienia, ale tak nie jest, między innymi dlatego, że binaria i biblioteki zawierają listę potrzebnych symboli oddzielnie od bibliotek, których potrzebują, więc moduł ładujący nie może sprawdzić, czy dana biblioteka zawiera wszystkie symbole, które są z tego potrzebne. Symbole mogą być udostępniane na różne sposoby, a wprowadzenie połączenia między symbolami a bibliotekami, które je udostępnią, może zniszczyć istniejące pliki binarne. Dodatkową zabawą jest wstawianie symboli, aby komplikować rzeczy (i sprawić, by programiści wrażliwi na bezpieczeństwo odrywali włosy).
Niektóre biblioteki zawierają informacje o wersji, które ostatecznie są przechowywane
.gnu.version_r
, wraz z linkiem do dostarczającej biblioteki, co by tu pomogło, alelibz
nie jest jedną z nich.(Biorąc pod uwagę sonames, oczekiwałbym, że twój
alpha
plik binarny będzie działał dobrzezlib.so.1.2.8
).źródło
zlib
i tak nie używalibtool
, z wyjątkiem Darwina, gdzie to jestar
;-).