NAZWA¶
dpkg-shlibdeps - generowanie zależności podstawień
współdzielonych bibliotek
SKŁADNIA¶
dpkg-shlibdeps [
opcja...] [
-e]
plik-wykonywalny
[
opcja...]
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).
- Wynik z "dpkg-query --control-path
pakiet symbols"
- Dostarczane przez pakiet informacje o
zależnościach bibliotek współdzielonych. O ile nie
jest nadpisany przez --admindir, pliki te są położone w
/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."
- Wynik z "dpkg-query --control-path
pakiet shlibs"
- Dostarczane przez pakiet informacje o
zależnościach bibliotek współdzielonych. O ile nie
jest nadpisany przez --admindir, pliki te są położone w
/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
-d pole-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.
- -?, --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.
OSTRZEŻENIA¶
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
bibliotekijeżeli nie byłoby niepotrzebnego
linkowania pliku-binarnego z nią (nie jest używany
żadny 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).
- 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).
- Dokładnie to samo co powyżej, tylko dla kilku
plików binarnych.
- 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 lub
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.
ZOBACZ TAKŻE¶
deb-shlibs(5),
deb-symbols(5),
dpkg-gensymbols(1).
TŁUMACZE¶
Piotr Roszatycki <dexter@debian.org>, 1999
Bartosz Feński <fenio@debian.org>, 2004-2005
Robert Luberda <robert@debian.org>, 2006-2008
Wiktor Wandachowicz <siryes@gmail.com>, 2008
Michał Kułach <michal.kulach@gmail.com>, 2012