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"
- Package-provided shared library dependency information. Unless overridden
by --admindir, those files are located in /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).
As a safe-guard measure, a symbols file can provide a
Build-Depends-Package meta-information field and
dpkg-shlibdeps
will extract the minimal version required by the corresponding package in the
Build-Depends field and use this version if it's higher than the
minimal version computed by scanning symbols.
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"
- Package-provided shared library dependency information. Unless overridden
by --admindir, those files are located in /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
-e plik_wykonywalny.
- -eplik-wykonywalny
- Include dependencies appropriate for the shared libraries required by
executable. This option can be used multiple times.
- -ldirectory
- Add directory to the list of directories to search for private
shared libraries (since dpkg 1.17.0). This option can be used multiple
times.
Note: Use this option instead of setting LD_LIBRARY_PATH, as that
environment variable is used to control the run-time linker and abusing it
to set the shared library paths at build-time can be problematic when
cross-compiling for example.
- -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[filename]
- Print substitution variable settings to standard output (or
filename if specified), rather than being added to the substitution
variables file ( debian/substvars by default).
- -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.
DIAGNOSTYKA¶
Warnings¶
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
-l biblioteka 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.
Errors¶
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")
- The binary uses a library called library-soname but
dpkg-shlibdeps has been unable to find the library.
dpkg-shlibdeps creates a list of directories to check as following:
directories listed in the RPATH of the binary, directories listed in
/etc/ld.so.conf, directories added by the -l option, directories
listed in the LD_LIBRARY_PATH environment variable, and standard
public directories (/lib, /usr/lib, /lib32, /usr/lib32, /lib64,
/usr/lib64). Then it checks those directories in the package's build tree
of the binary being analyzed, in the packages' build trees indicated with
the -S command-line option, in other packages' build trees that
contains a DEBIAN/shlibs or DEBIAN/symbols file and finally in the root
directory. If the library is not found in any of those directories, then
you get this error.
If the library not found is in a private directory of the same package, then
you want to add the directory with -l. If it's in another binary
package being built, you want to make sure that the shlibs/symbols file of
this package is already created and that -l contains the
appropriate directory if it also is in a private directory.
- 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.
Calling dpkg-shlibdeps in verbose mode (-v) will provide much
more information about where it tried to find the dependency information.
This might be useful if you don't understand why it's giving you this
error.
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