dpkg-shlibdeps(1) generowanie zależności podstawień współdzielonych bibliotek

SKŁADNIA

dpkg-shlibdeps [opcje] plik_wykonywalny|-eplik_wykonywalny [opcje]

OPIS

dpkg-shlibdeps określa zależności podstawień współdzielonych bibliotek dla plików wykonywalnych podanych jako argumenty. Zależności te są dodawane do pliku podstawień zmiennych debian/substvars jako zmienne shlibs:pole-zależności, przy czym pole-zależności jest nazwą odpowiedniego pola zależności. Wszystkie inne zmienne rozpoczynające się od shlibs: są usuwane z tego pliku.

dpkg-shlibdeps ma dwa źródła informacji służące do generowania informacji o zależnościach. Są to pliki symbols lub pliki shlibs. Dla każdego pliku binarnego analizowanego przez dpkg-shlibdeps określana jest lista bibliotek, z którymi jest on linkowany. Następnie dla każdej biblioteki przeglądany jest plik symbols lub plik shlibs (jeśli ten pierwszy nie istnieje, lub gdy debian/shlibs.local zawiera stosowną zależność). Oba pliki powinny być dostarczane przez pakiet zawierający bibliotekę i powinny więc być dostępne jako /var/lib/dpkg/info/pakiet.symbols lub /var/lib/dpkg/info/pakiet.shlibs. Nazwa pakietu jest określana w dwóch krokach: odnalezienie pliku biblioteki w systemie (sprawdzając w tych samych katalogach, których używa ld.so), a następnie użycie dpkg -S plik-biblioteki w celu określenia pakietu dostarczającego daną bibliotekę.

Pliki symboli

Pliki symboli zawierają dokładniejsze określenia informacji o zależnościach, dostarczając minimum zależności dla każdego symbolu eksportowanego przez bibliotekę. Skrypt próbuje odnaleźć plik związany z pakietem biblioteki w następujących miejscach (użyte jest pierwsze dopasowanie):
debian/*/DEBIAN/symbols
Informacje o współdzielonej bibliotece wygenerowane w bieżącym procesie budowy, który wywołał również dpkg-shlibdeps. Są one generowane przez dpkg-gensymbols(1). Są używane tylko, gdy biblioteka znajduje się w drzewie budowania pakietu. Plik "symbols" z tego drzewa ma pierwszeństwo nad plikami symboli z innych pakietów binarnych.
/etc/dpkg/symbols/pakiet.symbols.arch
/etc/dpkg/symbols/pakiet.symbols
Informacje o zasięgu systemu, które nadpisują informacje o zależnościach bibliotek współdzielonych. arch jest architekturą bieżącego systemu (określoną przez dpkg-architecture -qDEB_HOST_ARCH).
katalog_admin/info/pakiet.symbols
Dostarczane przez pakiet informacje o zależnościach bibliotek współdzielonych. O ile nie jest nadpisany, admindir ma wartość /var/lib/dpkg.

Podczas przeszukiwania symboli używanych przez wszystkie pliki binarne, dpkg-shlibdeps zapamiętuje (największą) minimalną wersję wymaganą dla każdej biblioteki. Na końcu procesu jest więc w stanie wypisać minimalne zależności dla każdej użytej biblioteki (pod warunkiem, że informacja z plików symbols jest dokładna).

Jako zabezpieczenie plik symboli może zawierać pole metainformacji Build-Depends-Package, zaś dpkg-shlibdeps określając minimalną wersję wymaganą przez odpowiadający pakiet z pola Build-Depends będzie używać właśnie tej wersji, jeśli jest ona wyższa niż minimalna wersja określona dzięki przeszukiwaniu symboli.

Pliki "shlibs"

Pliki "shlibs" wiążą bezpośrednio bibliotekę z zależnościami (bez przeglądania symboli). Jest to więc często silniejsze niż naprawdę potrzebne, ale bardzo bezpieczne i łatwe w obsłudze.

Zależności dla biblioteki są wyszukiwane w kilku miejscach. Używany jest pierwszy plik zawierający informacje dla danej biblioteki:

debian/shlibs.local
Lokalne informacje z pakietu nadpisujące informacje o zależnościach bibliotek współdzielonych.
/etc/dpkg/shlibs.override
Informacje o zasięgu systemu, które nadpisują informacje o zależnościach bibliotek współdzielonych.
debian/*/DEBIAN/shlibs
Informacje o zależnościach współdzielonych bibliotek wygenerowane w bieżącym procesie budowy, który wywołał również dpkg-shlibdeps. Są używane tylko, gdy biblioteka znajduje się w drzewie budowania pakietu. Plik "shlibs" z tego drzewa ma pierwszeństwo nad plikami shlibs z innych pakietów binarnych."
katalog_admin/info/package.shlibs
Dostarczane przez pakiet informacje o zależnościach bibliotek współdzielonych. O ile nie jest nadpisany, admindir ma wartość /var/lib/dpkg.
/etc/dpkg/shlibs.default
Domyślna informacja o zależnościach bibliotek współdzielonych, o zakresie systemu.

Uzyskane zależności są używane bezpośrednio (chyba, że są odfiltrowane ponieważ zostały zidentyfikowane jako duplikaty lub słabsze niż jakaś inna zależność).

OPCJE

dpkg-shlibdeps interpretuje parametry nie będące opcjami jako nazwy plików wykonywalnych, tak jakby były podane przez -eplik_wykonywalny.
-eplik_wykonywalny
Włączenie zależności odpowiadających bibliotekom współdzielonym wymaganym przez plik_wykonywalny.
-dpole_zależności
Dodanie zależności, które mają być dodane do pola zależności pole_zależności pliku kontrolnego. (Zależności dla tego pola są umieszczane w zmiennej shlibs:pole_zależności.)

Opcja -dpole_zależności wpływa na wszystkie pliki wykonywalne podane po tej opcji, aż do następnego -dpole_zależności. Domyślnym polem_zależności jest Depends.

Jeśli to samo określenie zależności (lub zbiór alternatyw) pojawia się w więcej niż jednej nazwie z rozróżnianych pól zależności Pre-Depends, Depends, Recommends, Enhances lub Suggests to dpkg-shlibdeps automatycznie usunie zależność ze wszystkich pól, poza polem reprezentującym najważniejsze zależności.

-pprefiks_nazw_zmiennych
Rozpoczynanie nazw zmiennych podstawiania od prefiks_nazw_zmiennych: zamiast shlibs:. Podobnie, wszystkie zmienne rozpoczynające się od prefiks_nazw_zmiennych: (zamiast shlibs:) są usuwane z pliku zmiennych podstawiania.
-O
Wyświetlenie ustawień zmiennych podstawiania na standardowe wyjście, zamiast dodawania ich do pliku zmiennych podstawiania (domyślnie debian/substvars).
-ttyp
Preferowanie informacji o zależnościach bibliotek współdzielonych oznaczonych dla danego typu pakietu. Jeśli informacji oznaczonych nie ma, używane są informacje bez oznaczeń. Domyślnym typem pakietu jest "deb". Informacje o zależnościach bibliotek współdzielonych są oznaczane dla danego typu pakietu przez poprzedzenie ich nazwą typu, dwukropkiem oraz białymi znakami (spacjami).
-Llokalny_plik_shlibs
Odczyt nadpisań informacji o bibliotekach współdzielonych z lokalnego_pliku_shlibs zamiast debian/shlibs.local.
-Tplik_zmiennych_podst
Zapis zmiennych podstawiania w pliku plik_zmiennych_podst; domyślnie jest to debian/substvars.
-v
Włączenie dodatkowych informacji. Wyświetlanych jest wiele komunikatów tłumaczących działanie dpkg-shlibdeps.
-xpakiet
Wyłączenie pakietu z generowanych zależności. Użyteczne aby zapobiec zależnościom pakietu od samego siebie dla pakietów dostarczających binaria typu ELF (pliki wykonywalne lub biblioteki), które zależą od innej biblioteki zawartej w tym samym pakiecie. Ta opcja może być użyta wielokrotnie aby wyłączyć kilka pakietów.
-Skatalog_budowania_pakietu
Przeglądanie najpierw katalogu_budowania_pakietu przy próbie odnalezienia biblioteki. Przydatne gdy pakiet źródłowy tworzy wiele odmian tej samej biblioteki, a chce się zapewnić uzyskanie zależności od określonego pakietu binarnego. Ta opcja może być użyta wielokrotnie: katalogi będą przeglądane w tej samej kolejności przed katalogami innych pakietów binarnych.
--ignore-missing-info
Kontynuacja pomimo braku informacji o zależnościach dla biblioteki współdzielonej. Odradza się używanie tej opcji, wszystkie biblioteki powinny dostarczać informacje o zależnościach (w postaci plików shlibs lub plików symboli) - nawet jeśli nie są jeszcze używane przez inne pakiety.
--warnings=wartość
wartość jest polem bitowym definiującym zbiór ostrzeżeń, które mogą być wysłane przez dpkg-shlibdeps. Bit 0 (wartość=1) włącza ostrzeżenie "w żadnej z bibliotek nie znaleziono symbolu symb używanego przez plik_binarny", bit 1 (wartość=2) włącza ostrzeżenie "można by uniknąć zależności od biblioteki bibl", zaś bit 2 (wartość=4) włącza ostrzeżenie "plik_binarny nie powinien być linkowany z biblioteką". Domyślną wartością jest 3: pierwsze dwa ostrzeżenia są domyślnie aktywne, zaś ostatnie nie. Ustawienie wartości na 7 powoduje aktywację wszystkich ostrzeżeń.
--admindir=katalog
Zmienia położenie bazy danych dpkg. Domyślnie jest to /var/lib/dpkg.
-h, --help
Wyświetla informację o użytkowaniu i kończy działanie.
--version
Wyświetla informację o wersji i pomyślnie kończy działanie.

UWAGI

Ponieważ dpkg-shlibdeps analizuje zbiór symboli używanych przez każdy plik binarny generowanego pakietu, jest w stanie wysyłać ostrzeżenia w pewnych przypadkach. Informują one o rzeczach, które mogą być ulepszone w pakiecie. W większości przypadków dotyczy to bezpośrednio oryginalnych źródeł. Poniżej zebrane są ostrzeżenia na jakie można natrafić, w kolejności malejącej ważności:
w żadnej z bibliotek nie znaleziono symbolu symb używanego przez plik_binarny
Wskazany symbol nie został odnaleziony w żadnej z bibliotek, z którymi jest linkowany plik binarny. Taki plik_binarny jest najpewniej biblioteką i powinien być linkowany z dodatkową biblioteką podczas budowania pakietu (opcja -lbiblioteka linkera).
plik_binarny zawiera nierozwiązywalne odniesienie do symbolu sym: prawdopodobnie jest to wtyczka
Wskazany symbol nie został odnaleziony w żadnej z bibliotek, z którymi jest linkowany plik binarny. Taki plik_binarny jest najpewniej wtyczką i jest prawdopodobnie dostarczany wraz z programem, który ładuję taką wtyczkę. Teoretycznie wtyczka nie powinna mieć pola SONAME, jednak ten plik binarny je posiada i nie można go zidentyfikować na tej podstawie. Fakt, iż plik ten jest umieszczony w niepublicznym katalogu mocno wskazuje na to, że nie jest on zwykłą biblioteką współdzieloną. Jeśli plik binarny rzeczywiście jest wtyczką, można pominąć to ostrzeżenie. Jednak zawsze istnieje możliwość, że jest to biblioteka i programy z nią linkowane używają RPATH, aby dynamiczny loader był w stanie ją odnaleźć. W takim przypadku bibliotekę można uznać za zepsutą i należy ją naprawić.
można by uniknąć zależności od biblioteki, jeżeli nie byłoby niepotrzebnego linkowania plików_binarnych z nią (nie są używane żadne z tamtejszych symboli).
Żaden z plików_binarnych, które są linkowane z biblioteką nie używa symboli przez nią udostępnianych. Poprawiając wszystkie pliki binarne można uniknąć zależności związanych z tą biblioteką (chyba, że taka sama zależność jest również generowana przez inną bibliotekę, która jest faktycznie używana).
plik_binarny nie powinien być linkowany z biblioteką (nie są używane żadne z tamtejszych symboli).
plik_binarny jest linkowany z biblioteką, której nie potrzebuje. Nie jest to problem, ale można uzyskać pewną poprawę wydajności czasu ładowania pliku binarnego, jeśli biblioteka ta nie będzie z nim linkowana. To ostrzeżenie sprawdza te same informacje co poprzednie, ale wykonuje to dla każdego pliku binarnego zamiast wykonywania globalnego sprawdzenia dla wszystkich analizowanych plików.

BŁĘDY

dpkg-shlibdeps przerwie działanie z błędem jeśli nie będzie w stanie znaleźć publicznej biblioteki używanej przez plik binarny, lub jeśli biblioteka taka nie będzie mieć powiązanej informacji o zależnościach (pliku shlibs lub pliku symboli). Publiczne biblioteki mają SONAME i są wersjonowane (jak np. libsomething.so.X). Biblioteki prywatne (jak np. wtyczki) nie powinny mieć SONAME i nie muszą być wersjonowane.
nie można znaleźć biblioteki soname-biblioteki potrzebnej dla pliku_binarnego (RPATH to "rpath")
plik_binarny używa biblioteki o nazwie soname-biblioteki, ale dpkg-shlibdeps nie mógł odnaleźć tej biblioteki. dpkg-shlibdeps tworzy listę katalogów do sprawdzenia w następujący sposób: katalogi wymienione w RPATH pliku binarnego, katalogi wymienione w /etc/ld.so.conf, katalogi wymienione w zmiennej środowiskowej LD_LIBRARY_PATH, oraz standardowe katalogi publiczne (/lib, /usr/lib, /lib32, /usr/lib32, /lib64, /usr/lib64). Następnie sprawdza podobnie katalogi w drzewie budowania pakietu dla analizowanego pliku binarnego, w drzewach budowania pakietów podanych jako parametry opcji -S, w innych drzewach budowania zawierających pliki DEBIAN/shlibs olub DEBIAN/symbols, a na końcu w katalogu głównym. Jeśli biblioteka nie zostanie odnaleziona w żadnym z tych katalogów, otrzymuje się ten błąd.

Jeśli nie odnaleziona biblioteka jest w prywatnym katalogu tego samego pakietu, należy dodać taki katalog do LD_LIBRARY_PATH. Jeśli biblioteka jest w innym budowanym binarnym pakiecie, należy upewnić się, że plik shlibs lub plik symboli dla tego pakietu został stworzony oraz, że LD_LIBRARY_PATH zawiera odpowiedni katalog jeśli biblioteka także jest w katalogu prywatnym.

nie znaleziono informacji o zależnościach dla plik-biblioteki (używanego przez plik-binarny).
Biblioteka wymagana przez plik-binarny została znaleziona przez dpkg-shlibdeps w pliku-biblioteki, ale dpkg-shlibdeps nie mógł odnaleźć żadnej informacji o zależnościach dla tej biblioteki. Aby określić zależności, podjęto próbę użycia dpkg -Splik-biblioteki w celu określenia pakietu dostarczającego daną bibliotekę. Następnie sprawdzono odpowiednie pliki shlibs i pliki symboli w /var/lib/dpkg/info/ oraz w różnych drzewach budowania pakietów (debian/*/DEBIAN/).

To niepowodzenie może być spowodowane przez niepoprawny lub nieistniejący plik shlibs lub plik symboli w pakiecie biblioteki. Może się również zdarzyć jeśli biblioteka jest budowana wewnątrz tego samego pakietu źródłowego, a pliki shlibs jeszcze nie zostały stworzone (w takim przypadku należy poprawić debian/rules aby shlibs były tworzone przed wywołaniem dpkg-shlibdeps). Niewłaściwa wartość RPATH może również powodować, że biblioteka zostanie odnaleziona pod nietypową nazwą, która nie jest związana z żadnym pakietem (np. /usr/lib/openoffice.org/../lib/libssl.so.0.9.8 zamiast /usr/lib/libssl.so.0.9.8). dpkg-shlibdeps próbuje poradzić sobie z tym starając się odczytać nazwę kanoniczną (z użyciem realpath(3)) ale może to nie zawsze zadziałać. Aby uniknąć problemów, najlepiej jest zawsze doprowadzić do porządku RPATH pliku binarnego.

Wywołanie dpkg-shlibdeps w trybie rozszerzonej informacji (-v) dostarcza wielu dodatkowych informacji o tym, gdzie próbował on znaleźć informację o zależnościach. Może to być przydatne jeśli nie wiadomo dlaczego zwracany jest ten błąd.

AUTORZY

Copyright © 1995-1996 Ian Jackson
Copyright © 2000 Wichert Akkerman
Copyright © 2006 Frank Lichtenheld
Copyright © 2007-2008 Raphaël Hertzog

Niniejszy program jest oprogramowaniem wolnym, sprawdź Powszechną Licencję Publiczną GNU w wersji drugiej lub późniejszej, by dowiedzieć się o warunkach dystrybucji. Brak JAKIEJKOLWIEK gwarancji.

TŁUMACZE

Piotr Roszatycki <[email protected]>, 1999
Bartosz Feński <[email protected]>, 2004-2005
Robert Luberda <[email protected]>, 2006-2008
Wiktor Wandachowicz <si[email protected]>, 2008