dpkg-shlibdeps - substitutievariabelen genereren over
afhankelijkheidsrelaties tot gedeelde bibliotheken
dpkg-shlibdeps [optie...] [-e]
programma [optie...]
dpkg-shlibdeps berekent de afhankelijkheidsrelaties tot
gedeelde bibliotheken voor de programma's die genoemd worden in zijn
argumenten. De afhankelijkheden worden in het bestand met
substitutievariabelen debian/substvars toegevoegd als variabelenaam
shlibs:afhankelijkheidsveld, waarbij
afhankelijkheidsveld de naam van een afhankelijkheidsveld is.
Eventuele andere variabelen die met shlibs: beginnen worden uit het
bestand verwijderd.
dpkg-shlibdeps heeft twee mogelijke informatiebronnen om
afhankelijkheidsinformatie te genereren, ofwel symbols-bestanden
ofwel shlibs-bestanden. Voor elke binair pakket dat
dpkg-shlibdeps analyseert, zoekt het de lijst van bibliotheken op
waarmee het gelinkt is. Vervolgens zoekt het voor iedere bibliotheek ofwel
het symbols-bestand of het shlibs-bestand (indien het eerste
niet bestaat of indien debian/shlibs.local de relevante
afhankelijkheidsinformatie bevat) op. Beide bestanden worden verondersteld
geleverd te worden door het bibliotheekpakket en zouden dus te vinden moeten
zijn als /var/lib/dpkg/info/pakket.symbols of
/var/lib/dpkg/info/pakket.shlibs. De naam van het pakket wordt
in twee stappen gevonden: het bibliotheekbestand opzoeken op het systeem (er
wordt in dezelfde mappen gezocht als die welke ld.so zou gebruiken)
en dan dpkg -S bibliotheekbestand gebruiken om het pakket op
te zoeken dat de bibliotheek levert.
Symboolbestanden bevatten fijnmazige afhankelijkheidsinformatie
door voor ieder symbool dat de bibliotheek exporteert, de minimumvereiste op
te geven. Het script tracht een symboolbestand dat bij een bibliotheekpakket
hoort op de volgende plaatsen te vinden (het eerste dat gevonden wordt,
wordt gebruikt):
- debian/*/DEBIAN/symbols
- Informatie over gedeelde bibliotheken die gegenereerd werd door het
huidige bouwproces dat ook dpkg-shlibdeps aanriep. Zij worden
gegenereerd door dpkg-gensymbols(1). Ze worden enkel gebruikt als
de bibliotheek aangetroffen wordt in de bouwboom van een pakket. Het
bestand symbols in die bouwboom heeft voorrang op symboolbestanden van
andere binaire pakketten.
- /etc/dpkg/symbols/pakket.symbols.arch
- /etc/dpkg/symbols/pakket.symbols
- Systeemspecifieke vervangingsinformatie over afhankelijkheidsrelaties tot
gedeelde bibliotheken. arch is de architectuur van het huidige
systeem (verkregen door dpkg-architecture -qDEB_HOST_ARCH).
- Uitvoer van
“dpkg-query --control-path pakket
symbols”
- Door een pakket verstrekte informatie over afhankelijkheidsrelaties tot
gedeelde bibliotheken. Tenzij anders bepaald door --admindir, zijn
deze bestanden te vinden in /var/lib/dpkg.
Tijdens het doorzoeken van de door al de programma's gebruikte
symbolen, onthoudt dpkg-shlibdeps van elke bibliotheek de (hoogste)
minimale versie die nodig is. Op het eind van het proces is het in staat
voor elke gebruikte bibliotheek uit te schrijven wat de minimale vereiste is
(in de veronderstelling dat de informatie uit de symbols-bestanden
accuraat is).
Bij wijze van beschermende maatregel kan een symbols-bestand een
meta-informatieveld Build-Depends-Pakket bevatten. Dan zal
dpkg-shlibdeps de door het corresponderende pakket vereiste minimale
versie halen uit het veld Build-Depends en deze versie gebruiken als
ze hoger is dan de minimale versie die berekend werd via het doorzoeken van
symbolen.
Shlibs-bestanden koppelen rechtstreeks een bibliotheek aan een
vereiste (zonder naar de symbolen te kijken). Dit is dus dikwijls strikter
dan echt nodig, maar erg veilig en gemakkelijk te hanteren.
De afhankelijkheidsrelaties tot een bibliotheek worden op
verschillende plaatsen opgezocht. Het eerste bestand dat informatie biedt
over de bibliotheek in kwestie, wordt gebruikt:
- debian/shlibs.local
- Pakket-eigen vervangende informatie over afhankelijkheidsrelaties tot
gedeelde bibliotheken.
- /etc/dpkg/shlibs.override
- Systeemspecifieke vervangende informatie over afhankelijkheidsrelaties tot
gedeelde bibliotheken.
- debian/*/DEBIAN/shlibs
- Informatie over gedeelde bibliotheken die gegenereerd werd door het
huidige bouwproces dat ook dpkg-shlibdeps inriep. Ze wordt enkel
gebruikt als de bibliotheek aangetroffen wordt in de bouwboom van het
pakket. Het shlibs-bestand in die bouwboom heeft voorrang op
shlibs-bestanden van andere binaire pakketten.
- Uitvoer van
“dpkg-query --control-path pakket
shlibs”
- Door een pakket verstrekte informatie over afhankelijkheidsrelaties tot
gedeelde bibliotheken. Tenzij anders bepaald door --admindir, zijn
deze bestanden te vinden in /var/lib/dpkg.
- /etc/dpkg/shlibs.default
- Systeemspecifieke standaardinformatie over afhankelijkheidsrelaties tot
gedeelde bibliotheken.
De uitgelichte afhankelijkheden worden dan rechtstreeks gebruikt
(behalve als ze uitgefilterd werden omdat ze als duplicaten onderkend werden
of als zwakker dan een andere afhankelijkheid).
Argumenten die geen opties zijn, worden door dpkg-shlibdeps
geïnterpreteerd als namen van programma's, net alsof ze opgegeven
werden als -eprogramma.
- -eprogramma
- De gepaste afhankelijkheidsrelaties tot gedeelde bibliotheken die nodig
zijn voor programma, toevoegen. Deze optie kan meermaals gebruikt
worden.
- -lmap
- map vooraan toevoegen aan de lijst van mappen waarin naar
particuliere gedeelde bibliotheken gezocht moet worden (sinds dpkg
1.17.0). Deze optie kan meermaals gebruikt worden.
Opmerking: gebruik deze optie in de plaats van het
instellen van LD_LIBRARY_PATH, aangezien die omgevingsvariabele
gebruikt wordt om de runtime linker aan te sturen. Daarvan misbruik
maken om de paden van gedeelde bibliotheken in te stellen tijdens het
bouwen van het programma, kan problematisch zijn, bijvoorbeeld bij het
cross-compileren.
- -dafhankelijkheidsveld
- Afhankelijkheidsinformatie opgeven die toegevoegd moet worden aan het
afhankelijkheidsveld afhankelijkheidsveld van het bestand control.
(De afhankelijkheidsinformatie voor dit veld wordt in de variabele
shlibs:dependency-field geplaatst.)
De optie -dafhankelijkheidsveld heeft uitwerking
voor alle programma's na de optie tot aan het volgende
-dafhankelijkheidsveld. Het standaard
afhankelijkheidsveld is Depends.
Indien hetzelfde afhankelijkheidsitem (of set van
alternatieven) te vinden is in meer dan een van de herkende namen voor
afhankelijkheidsvelden Pre-Depends, Depends,
Recommends, Enhances of Suggests, zal
dpkg-shlibdeps de afhankelijkheid automatisch uit alle velden
verwijderen, behalve uit het veld dat de belangrijkste afhankelijkheid
vertegenwoordigt.
- -pvariabelenaamprefix
- Substitutievariabelen beginnen met variabelenaamprefix: in
plaats van met shlibs:. Op dezelfde wijze worden eventuele
substitutievariabelen die beginnen met variabelenaamprefix:
(in plaats van met shlibs:), verwijderd uit het bestand met
substitutievariabelen.
- -O[bestandsnaam]
- De instellingen in verband met substitutievariabelen weergeven op de
standaarduitvoer (of in bestandsnaam als die opgegeven werd; sinds
dpkg 1.17.2), eerder dan ze toe te voegen aan het bestand met
substitutievariabelen (standaard is dat debian/substvars).
- -ttype
- De voorrang geven aan informatie over afhankelijkheidsrelaties tot
gedeelde bibliotheken die gemarkeerd werd als geldend voor het opgegeven
pakkettype. Indien er geen gemarkeerde informatie te vinden is, wordt
teruggevallen op niet-gemarkeerde informatie. Het standaardpakkettype is
deb. Informatie over afhankelijkheidsrelaties tot gedeelde
bibliotheken wordt gemarkeerd als geldend voor een bepaald type door ze te
laten voorafgaan door de naam van dat type, een dubbele punt en
witruimte.
- -Llokaal-shlibs-bestand
- Vervangende informatie over afhankelijkheidsrelaties tot gedeelde
bibliotheken lezen uit lokaal-shlibs-bestand in plaats van uit
debian/shlibs.local.
- -Tsubstvars-bestand
- Substitutievariabelen opschrijven in substvars-bestand. Standaard
is dat debian/substvars.
- -v
- De breedsprakige modus inschakelen (sinds dpkg 1.14.8). Talrijke berichten
worden weergegeven om uit te leggen wat dpkg-shlibdeps doet.
- -xpakket
- Het pakket uitsluiten van de gegenereerde afhankelijkheden (sinds dpkg
1.14.8). Dit is nuttig om een afhankelijkheid van zichzelf te vermijden
voor pakketten die binaire bestanden van het type ELF aanleveren
(programma's of bibliotheekuitbreidingen), waarbij die binaire bestanden
gebruik maken van een bibliotheek die in hetzelfde pakket te vinden is.
Deze optie kan meermaals gebruikt worden om meerdere pakketten uit te
sluiten.
- -Spakket-bouwmap
- Eerst zoeken in pakket-bouwmap bij het zoeken naar een bibliotheek
(sinds dpkg 1.14.15). Dit is nuttig als het broncodepakket meerdere
varianten van dezelfde bibliotheek bouwt en u zeker wilt zijn dat u de
afhankelijkheden krijgt van een specifiek binair pakket. U kunt deze optie
meermaals gebruiken: mappen zullen in de opgegeven volgorde doorzocht
worden vooraleer gezocht wordt in de mappen van andere binaire
pakketten.
- -Ipakketbouwmap
- pakketbouwmap overslaan bij het zoeken naar shlibs-, symbolen- en
gedeelde bibliotheek-bestanden (sinds dpkg 1.18.5). U kunt deze optie
meermaals gebruiken.
- --ignore-missing-info
- Het niet als een mislukking beschouwen als voor een gedeelde bibliotheek
geen afhankelijkheidsinformatie gevonden kan worden (sinds dpkg 1.14.8).
Het wordt afgeraden om deze optie te gebruiken. Alle bibliotheken zouden
afhankelijkheidsinformatie moeten verschaffen (ofwel via shlibs-bestanden
of via symboolbestanden), zelfs als die nog niet door andere pakketten
gebruikt wordt.
- --warnings=waarde
- waarde is een bit-veld dat aangeeft welke set waarschuwingen
dpkg-shlibdeps kan geven (sinds dpkg 1.14.17). Bit 0 (waarde=1)
activeert de waarschuwing “symbool sym dat door
binair-bestand gebruikt wordt, werd in geen enkele bibliotheek
aangetroffen”, bit 1 (waarde=2) activeert de waarschuwing
“pakket zou een nutteloze afhankelijkheid kunnen vermijden”
en bit 2 (waarde=4) activeert de waarschuwing
“binair-bestand zou niet gelinkt moeten worden met
bibliotheek”. De standaard-waarde is 3: standaard
zijn de eerste twee waarschuwingen geactiveerd, de laatste niet. Stel de
waarde in op 7 indien u wilt dat alle waarschuwingen geactiveerd
worden.
- --admindir=map
- Een andere locatie opgeven voor de database van dpkg (sinds dpkg
1.14.0). De standaardlocatie is /var/lib/dpkg.
- -?, --help
- Info tonen over het gebruik en afsluiten.
- --version
- De versie tonen en afsluiten.
- DPKG_COLORS
- Stelt de kleurmodus in (sinds dpkg 1.18.5). Waarden die momenteel gebruikt
mogen worden zijn: auto (standaard), always en
never.
- DPKG_NLS
- Indien dit ingesteld is, zal het gebruikt worden om te beslissen over het
activeren van moedertaalondersteuning, ook gekend als
internationaliseringsondersteuning (of i18n) (sinds dpkg 1.19.0). Geldige
waarden zijn: 0 and 1 (standaard).
Aangezien dpkg-shlibdeps de set symbolen analyseert die
gebruikt wordt door elk binair bestand uit het gegeneerde pakket, is het in
staat om in verschillende gevallen waarschuwingen te geven. Zij geven u
informatie over zaken die in het pakket verbeterd kunnen worden. In de
meeste gevallen hebben die verbeteringen rechtstreeks betrekking op de
broncode van de toeleveraar (upstream). In aflopende volgorde van
belangrijkheid volgen hierna de waarschuwingen die u kunt krijgen:
- symbool
sym gebruikt door binair-bestand in geen enkele
bibliotheek gevonden.
- Het aangegeven symbool werd niet aangetroffen in de bibliotheken die met
het binair bestand gelinkt werden. Hoogstwaarschijnlijk is
binair-bestand een bibliotheek die gelinkt moet worden met een
andere bibliotheek tijdens het bouwproces (optie
-lbibliotheek van de linker).
- Binair bestand
bevat een onoplosbare verwijzing naar symbool sym: wellicht
is het een uitbreiding
- Het aangegeven symbool werd niet aangetroffen in de bibliotheken die
gelinkt zijn met het binair bestand. Hoogstwaarschijnlijk is het
binair-bestand een uitbreiding (plug-in) en wordt het symbool ter
beschikking gesteld door het programma dat deze uitbreiding laadt. In
theorie heeft een uitbreiding geen SONAME, maar dit binair bestand heeft
er wel een en in die hoedanigheid kon het niet met zekerheid
geïdentificeerd worden als een uitbreiding. Het feit evenwel dat
het binaire bestand opgeslagen wordt in een niet-publieke map is een
sterke aanwijzing dat het niet om een gewone gedeelde bibliotheek gaat.
Indien het binaire bestand effectief een uitbreiding is, mag u deze
waarschuwing negeren. Maar er bestaat altijd een kans dat het om een echte
bibliotheek gaat en dat programma's die ermee linken gebruik manken van
een RPATH waardoor de dynamische lader ze kan vinden. In dat geval gaat
het om een defecte bibliotheek en moet het defect gerepareerd worden.
- Het pakket zou een nutteloze
afhankelijkheid kunnen vermijden indien binair-bestand niet
gelinkt was met bibliotheek (het gebruikt geen enkel symbool
van de bibliotheek)
- Geen enkel van de binaire-bestanden die gelinkt werden met
bibliotheek gebruikt een symbool dat door de bibliotheek
aangeleverd wordt. Door al de binaire bestanden te repareren zou u de
afhankelijkheidsrelatie die verband houdt met deze bibliotheek, kunnen
vermijden (tenzij dezelfde afhankelijkheid ook gegenereerd wordt door een
andere bibliotheek die echt gebruikt wordt).
- Het pakket zou een
nutteloze vereiste kunnen vermijden indien programma's niet
gelinkt waren met bibliotheek (ze gebruiken geen enkel symbool
van de bibliotheek)
- Identiek dezelfde waarschuwing als hierboven, maar dan voor meerdere
programma's.
- Binair-bestand
zou niet gelinkt moeten worden met bibliotheek (het
gebruikt geen enkel symbool van de bibliotheek)
- Het binair-bestand is gelinkt met een bibliotheek die het niet
nodig heeft. Dit is geen probleem, maar er kan een kleine prestatiewinst
bekomen worden wat de laadtijd van het binair bestand betreft, door deze
bibliotheek niet met dit binair bestand te koppelen. Deze waarschuwing
controleert dezelfde informatie als de voorgaande, maar doet dit voor elk
binair bestand in plaats van de toets globaal uit te voeren voor alle
geanalyseerde binaire bestanden.
dpkg-shlibdeps zal mislukken als het een publieke
bibliotheek die door een binair bestand gebruikt wordt, niet kan vinden of
indien er geen afhankelijkheidsinformatie (ofwel een shlibs-bestand of een
symboolbestand) aan die bibliotheek gekoppeld is. Een publieke bibliotheek
heeft een SONAME en heeft een versienummer (lib-iets.so.X). Een
private bibliotheek (zoals een uitbreiding - plug-in) zou geen SONAME mogen
hebben en heeft geen versienummer nodig.
- Kon bibliotheek
SONAME-van-bibliotheek die binair-bestand nodig
heeft, niet vinden (het RPATH ervan is 'rpath')
- Het binair-bestand gebruikt een bibliotheek met de naam
soname-van-bibliotheek, maar dpkg-shlibdeps heeft de
bibliotheek niet kunnen vinden. dpkg-shlibdeps legt als volgt een
lijst van te controleren mappen aan: mappen die vermeld worden in het
RPATH van het binair bestand, mappen die toegevoegd werden via de optie
-l, mappen die vermeld worden in de omgevingsvariabele
LD_LIBRARY_PATH, kruismultiarch-mappen (bijv. /lib/arm64-linux-gnu,
/usr/lib/arm64-linux-gnu), standaard publieke mappen (/lib, /usr/lib),
mappen vermeld in /etc/ld.so.conf en verouderde multibibliotheekmappen
(/lib32, /usr/lib32, /lib64, /usr/lib64). Daarna controleert het die
mappen binnenin de bouwboom van het binaire pakket dat geanalyseerd wordt,
binnenin de pakketbouwbomen die met de commandoregeloptie -S
opgegeven werden, binnenin de bouwbomen van andere pakketten die een
bestand DEBIAN/shlibs of DEBIAN/symbols hebben en tenslotte in de
basismap. Als de bibliotheek in geen enkele van die mappen aangetroffen
wordt, krijgt u deze foutmelding.
Indien de niet-gevonden bibliotheek zich in een private map
van hetzelfde pakket bevindt, dan moet u die map toevoegen met de optie
-l. Als ze zich bevindt in een ander binair pakket dat gebouwd
wordt, moet u erop letten dat het bestand shlibs/symbols van dat pakket
reeds gemaakt is en dat -l de gepaste map bevat als ze zich ook
in een private map bevindt.
- Geen
afhankelijkheidsinformatie gevonden voor bibliotheekbestand
(dat gebruikt wordt door binair-bestand).
- De bibliotheek die binair-bestand nodig heeft, werd door
dpkg-shlibdeps in bibliotheekbestand gevonden, maar
dpkg-shlibdeps was niet in staat vereisteninformatie voor die
bibliotheek te vinden. Om vereistengegevens te vinden heeft het geprobeerd
de bibliotheek op te zoeken in een Debian pakket met behulp van dpkg
-S bibliotheekbestand. Daarna heeft het de overeenkomstige
shlibs- en symbols-bestanden nagekeken in /var/lib/dpkg/info/ en in de
verschillende bouwbomen van het pakket (debian/*/DEBIAN/).
Deze mislukking kan veroorzaakt worden door een slecht of
ontbrekend shlibs- of symbols-bestand in het pakket van de bibliotheek.
Ze kan zich ook voordoen als de bibliotheek gebouwd wordt binnen
hetzelfde broncodepakket en de shlibs-bestanden nog niet aangemaakt zijn
(in dat geval moet u debian/rules repareren zodat de shlibs gemaakt
worden voordat dpkg-shlibdeps ingeroepen wordt). Een slecht RPATH
kan er ook toe leiden dat de bibliotheek te vinden is onder een
niet-conforme naam (bijvoorbeeld
/usr/lib/openoffice.org/../lib/libssl.so.0.9.8 in plaats van
/usr/lib/libssl.so.0.9.8), die aan geen enkel pakket gekoppeld is.
dpkg-shlibdeps tracht dit te omzeilen door terug te vallen op een
conforme naam (met behulp van realpath(3)), maar dit lukt niet
altijd. Het is altijd het beste om het RPATH van het binair bestand uit
te zuiveren om problemen te voorkomen.
Het inroepen van dpkg-shlibdeps in de breedsprakige
modus (-v) zal veel meer informatie geven over waar het programma
de afhankelijkheidsinformatie tracht te vinden. Dit kan nuttig zijn
indien u niet begrijpt waarom u deze foutmelding krijgt.