dpkg-shlibdeps - skapar substvar-beroenden för delade bibliotek
dpkg-shlibdeps [
flagga...] [
-e]
programfil
[
flagga...]
dpkg-shlibdeps beräknar beroenden mellan exekverbara filer som
anges som argument och delade bibliotek. Beroendena läggs till i
substitueringsvariabelfilen
debian/substvars som variabler med namnen
shlibs:beroendefält där
beroendeefält är ett beroendefältsnamn. Alla andra
variabler som börjar på
shlibs: tas bort ur filen.
dpkg-shlibdeps kan generera beroendeinformation från två
informationskällor, antingen filen
symbols eller filen
shlibs. För varje binärfil som analyseras av
dpkg-shlibdeps tas en lista fram över vilka bibliotek de
är länkade mot. Programmet slår sedan upp varje bibliotek
i filen
symbols, eller i filen
shlibs (om den
förstnämnda inte existerar eller om debian/shlibs.local
innehåller ett relevant beroende). ). De båda filerna ska
tillhandahållas av bibliotekspaketet och borde därför
vara tillgängliga som /var/lib/dpkg/info/
paket.
symbols
eller /var/lib/dpkg/info/
paket.
shlibs. Paketnamnet identifieras
i två steg: biblioteksfilen lokaliseras på systemet (genom att
slå upp i de kataloger
ld.so skulle använt), och
därefter används
dpkg -S biblioteksfil för
att slå upp vilket paket biblioteket kommer från.
Symbolfiler innehåller mer finkornig beroendeinformation genom att ange
det minsta beroendet för varje symbol som exporteras av biblioteket.
Skriptet försöker hitta de symboler som är associerade
med ett bibliotek på följande platser (den första
träffen används):
- debian/*/DEBIAN/symbols
- Information om delade bibliotek som skapats av den aktuella
byggproceduren som också anropade dpkg-shlibdeps. De
genereras av dpkg-gensymbols(1). De används endast om
biblioteket finns i paketets byggräd. Filen symbols i det
byggträdet går före symbols-filer från andra
binärpaket.
- /etc/dpkg/symbols/package.symbols.arkitektur
- /etc/dpkg/symbols/paket.symbols
- Överstyrningsfil för beroendeinformation
för delade bibliotek, per system. arkitektur är det
aktuella systemets arkitektur (hämtas från
dpkg-architecture -qDEB_HOST_ARCH).
- Utdata från ”dpkg-query --control-path
package symbols”
- Paketlokal överstyrande beroendeinformation
för delade bibliotek. Filerna befinner sig i /var/lib/dpkg om inte
överstyrt med --admindir.
dpkg-shlibs kommer ihåg den (största) minimala version som
behövs av varje bibliotek när den söker genom de symboler
som används av alla binärfilerna. När proceduren
är avslutad kan den visa det minsta beroende som behövs av alla
bibliotek som används (så tillvida informationen i
symbols-filerna är korrekt).
Som en säkerhetsåtgärd kan en symbols-fil innehålla
metainformationsfältet
Build-Depends-Package, varpå
dpkg-shlibdeps hämtar vilken minsta version som behövs
för paketet ur
Build-Depends-fältet och använder
denna version om den är högre än den minsta version som
beräknats genom att söka genom symbolerna.
Shlibs-filer associerar ett bibliotek direkt till ett beroende (utan att se
på symbolerna). Det är därför oftare starkare
än vad som egentligen behövs, men mycket säkert och
enkelt att hantera.
Beroenden för ett bibliotek slås upp på flera platser. Den
första filen som innehåller information om det intressanta
biblioteket används:
- debian/shlibs.local
- Paketlokal överstyrande beroendeinformation
för delade bibliotek.
- /etc/dpkg/shlibs.override
- Systemspecifik överstyrande beroendeinformation
för delade bibliotek.
- debian/*/DEBIAN/shlibs
- Information om delade bibliotek som skapats av den aktuella
byggproceduren som också anropade dpkg-shlibdeps. De
genereras av dpkg-gensymbols(1). De används bara om
biblioteket finns i paketets byggträd. Filen shlibs i
byggträdet går före shlibs-filer från andra
paket.
- Utdata från ”dpkg-query --control-path
package shlibs”
- Paketlokal överstyrande beroendeinformation
för delade bibliotek. Filerna befinner sig i /var/lib/dpkg om inte
överstyrt med --admindir.
- /etc/dpkg/shlibs.default
- Systemspecifik standardberoendeinformation för
delade bibliotek.
De utökade beroendena används sedan direkt (förutom om de
filtrerats bort för att de identifierats som dubbletter, eller svagare
än ett annat beroende).
dpkg-shlibdeps tolkar argument som inte är flaggor som namn
på körbara filer, precis som om de angivits som
-eprogramfil.
-
-eprogramfil
- Ta med beroenden som är passar för delade
bibliotek som krävs för programfil. Flaggan kan
användas flera gånger.
-
-lkatalog
- Lägg till katalog först i listan
över kataloger som ska eftersökas efter privata delade
bibliotek (sedan dpkg 1.17.0). Flaggan kan användas flera
gånger.
Observera: Använd den här flaggan istället
för att sätta LD_LIBRARY_PATH, eftersom
miljövariabeln används för att styra
körtidslänkaren, och genom att utnyttja det för att
ange sökvägen till delade bibliotek vid kompilering kan det
uppstå problem, till exempel vid korskompilering.
-
-dberoendefält
- Lägg till beroenden som ska läggas till till
control-filens beroendefält beroendefält. (Beroenden
för detta fält läggs in i variabeln
shlibs:beroendefält.)
Flaggan -dberoendefält gäller för
samtliga binärer efter flaggan, fram till nästa
-dberoendefält. Standardvärdet för
beroendefält är Depends.
Om samma katalogpost (eller en uppsättning alternativ)
förekommer i mer än ett av de kända
beroendefältnamnen Pre-Depends, Depends,
Recommends, Enhances eller Suggests så kommer
dpkg-shlibdeps att automatiskt ta bort beroendet från
samtliga fält förutom det som anger de viktigaste
beroendena.
-
-pvariabelnamnsprefix
- Inled substitueringsvariabler med
variabelnamnsprefix : i stället för
shlibs:. På samma sätt kommer befintliga
substitueringsvariabler som inleds med variabelnamnsprefix:
(i stället för shlibs:) att tas bort från
substitueringsvariabelfilen.
-
-O[filnamn]
- Skriv substitueringsvariabelinställningar på
standard ut (eller filnamn om angivet, sedan dpkg 1.17.2), i
stället för att försöka lägga till dem
i substitueringsvariabelfilen (som standard debian/substvars).
-
-ttyp
- Föredra information om delade bibliotek som
märkts för den givna pakettypen. Om det inte finns
någon märkt information används omärkt.
Standardpakettypen är deb. Beroendeinformation för
delade bibliotek märks för en given typ genom att inleda det
med namnet på typen, ett kolon, samt blanktecken.
-
-Llokal-shlibs-fil
- Läs överstyrande beroendeinformation om
delade bibliotek från lokal-shlibs-fil i stället
för debian/shlibs.local.
-
-Tsubstvars-fil
- Skriv substitueringsvariabler i substvars-fil;
standard är debian/substvars.
- -V
- Aktiverar pratsamt läge (sedan dpkg 1.14.8). Flera
meddelanden visas för att förklara vad dpkg-shlibs
håller på med.
-
-xpaket
- Uteslut paketet från de genererade beroendena (dpkg
1.14.8). Flaggan är användbar för att undvika
självberoenden för paket som innehåller
ELF-binärer (exekverbara eller biblioteksinsticksprogram) som
använder ett bibliotek som ligger i samma paket. Flaggan kan
användas flera gånger för att utesluta flera
paket.
-
-Spaketbyggkatalog
- Se först i paketbyggkatalog vid
försök att hitta ett bibliotek (sedan dpkg 1.14.15).
Användbart när källkodspaketet bygger flera varianter
av samma bibliotek och du vill se till att du får beroendet
från ett givet binärpaket. Flaggan kan användas flera
gånger: kataloger söks efter i samma ordning före
kataloger från andra binärpaket.
-
-Ipaketbyggkatalog
- Ignorera paketbyggkatalog vid sökning efter
delade shlibs, symboler och delade biblioteksfiler (sedan dpkg 1.18.5).
Flaggan kan användas flera gånger.
- --ignore-missing-info
- Misslyckas inte om det inte upptäcks någon
beroendeinformation för ett delat bibliotek (sedan dpkg 1.14.8).
Den här flaggan rekommenderas inte, alla bibliotek bör
tillhandahålla beroendeinformation (antingen med shlibs-filer eller
med symbols-filer), även om de ännu inte används av
andra paket.
-
--warnings=värde
-
Värde är ett bitfält som anger
de varningar som kan ges av dpkg-shlibdeps (sedan dpkg 1.14.17).
Bit 0 (värde=1) aktiverar varningen ”symbolen sym,
som används av binär, hittades inte i något av
biblioteken”, bit 1 (värde=2) aktiverar varningen
”paketet kunde undvika ett onödigt beroende” och bit
2 (värde=4) aktiverar varningen ” binär borde
inte vara länkat mot bibliotek”. Standard för
värde är 3: de första två varningarna
är aktiva som standard, men inte den sista. Sätt
värde till 7 om du vill att alla varningar ska vara
aktiva.
-
--admindir=kat
- Ändra platsen för dpkg-databasen
(sedan dpkg 1.14.0). Förvald plats är
/var/lib/dpkg.
-
-?, --help
- Visar hjälpskärm och avslutar.
- --version
- Visar version och avslutar.
- DPKG_COLORS
- Väljer färgläge (sedan dpkg 1.18.5).
För närvarande godtas följande värden:
auto (förval), always och never.
- DPKG_NLS
- Om satt, används för att bestämma om
lokalt språkstöd ska aktiveras, även känt som
internationaliseringsstöd (eller i18n) (sedan dpkg 1.19.0).
Tillåtna värden är: 0 och 1
(förval).
Eftersom
dpkg-shlibdeps analyserar mängden symboler som
används av varje binärfil i det genererade paketet, kan det i
flera fall skriva ut varningsmeddelanden. De visar på saker som kan
förbättras i paketet. I de flesta fall gäller
förbättringarna direkt uppströmskällkoden.
Här är de varningar du kan stöta på, i fallande
allvarlighetsgrad:
-
symbolen sym, som används av
binär, hittades inte i något av
biblioteken.
- Den omnämnda symbolen hittades inte i biblioteken
som länkas mot binären. Binär är
antagligen ett bibliotek och måste länkas mot ett annat
bibliotek under byggproceduren (länkarflaggan
-lbibliotek).
-
binär innehåller en referens till
symbolen sym som inte kan kopplas; det är troligen ett
insticksprogram
- Den angivna symbolen hittades inte i biblioteken som
länkats mot binären. Binär är
antagligen ett insticksprogram och symbolen tillhandahålls av
programmet som läser in det. I teorin har inte insticksprogram
något SONAME, men den här binären har ett och
därmed kunde det inte tydligt identifieras som insticksprogram. Det
faktum att binären befinner sig i en icke-offentlig katalog
är dock en stark indikation på att det inte är ett
vanligt delat bibliotek. Om binären faktiskt är ett
insticksprogram kan du ignorera varningen. Det är dock alltid
möjligt att det är ett riktigt bibliotek och att program som
länker det använder en RPATH så att den dynamiska
länkaren hittar det. Om så är fallet är
biblioteket trasigt och behöver fixas.
-
paketet kan undvika ett onödigt beroende om
binär inte länkades mot bibliotek (det
använder inget av bibliotekets symboler)
- Ingen av binärerna som länkas mot
bibliotek använder någon av symbolerna som
tillhandahålls av biblioteket. Genom att rätta alla
binärer kan du undvika beroendet som gäller detta bibliotek
(såvida inte samma beroende även genereras av ett annat
bibliotek som faktiskt används).
-
paketet kunde undvika ett onödigt beroende om
binärer inte länkades mot bibliotek
(de använder inga av bibliotekets symboler)
- Exakt samma varning som ovan, men för flera
binärer
-
binär borde inte vara länkat
mot bibliotek (det använder inget av bibliotekets
symboler)
-
Binär länkar mot ett bibliotek den
inte behöver. Det är inte ett problem, Men genom att inte
länka biblioteket mot binären kan man uppnå en mindre
prestandaförbättring. Varningen kontrollerar samma
information som den föregående, men gör det
för varje binär istället för att utföra
kontrollen globalt på alla analyserade binärer.
dpkg-shlibdeps kommer att misslyckas om det inte hittar ett öppet
bibliotek som en av binärerna använder, eller om biblioteket
saknar associerad beroendeinformation (antingen en shlibs-fil eller en
symbols-fil). Ett öppet bibliotek har ett SONAME och är
versionshanterad (libvadsomhelst.so.
X). Ett privat bibliotek (till
exempel ett insticksprogram) bör inte ha något SONAME och
behöver inte vara versionshanterat.
-
hittade inte biblioteket bibliotek-sonamn
som behövs för binär (dess RPATH
är " rpath")
-
Binär använder ett bibliotek som heter
bibliotek-sonamn, men dpkg-shlibdeps kunde inte hitta
biblioteket. dpkg-shlibdeps skapar en lista över kataloger
det ser i på följande sätt: katalogerna som beskrivs
i RPATH i binären, kataloger som lagts till med flaggan -l,
kataloger i miljövariabeln LD_LIBRARY_PATH,
kors-multiarkitekturskataloger (t.ex /lib/arm64-linux-gnu,
/usr/lib/arm64-linux-gnu), vanliga öppna kataloger (/lib,
/usr/lib), kataloger listade i /etc/ld.so.conf, samt
föråldrade multilib-kataloger (/lib32, /usr/lib32, /lib64,
/usr/lib64). Därefter ser det i motsvarande kataloger i
byggträdet för paketet som innehåller binären
som analyseras, i paketbyggträdet som anges med kommandoradsflaggan
-S, i andra pakets byggträd som innehåller en
DEBIAN/shlibs-fil och slutligen i rotkatalogen. Om biblioteket inte hittas
i någon av dessa kataloger får du det här
felmeddelandet.
Om biblioteket som inte hittades ligger i en privat katalog i samma paket
bör du lägga till katalogen med -l. Om det finns i
ett annat binärpaket som byggs bör du se till att shlibs-
eller symbols-filen för paketet redan har skapats och att -l
innehåller korrekt katalog som det också ligger i en privat
katalog.
-
hittade ingen beroendeinformation för
biblioteksfil (använd av
binär).
- Biblioteket som behövs av binär
hittades i biblioteksfil av dpkg-shlibdeps, men
dpkg-shlibdeps kunde inte hitta någon beroendeinformation
för biblioteket. För att hitta beroendet har det
försökt koppla biblioteket mot ett Debianpaket med
hjälp av dpkg -S biblioteksfil. Därefter
såg det i motsvarande shlibs- och symbols-filer i
/var/lib/dpkg/info/, samt i de olika paketens byggträd
(debian/*/DEBIAN/).
Det här felet kan orsakas av felaktiga eller saknade shlibs- eller
symbols-filer i bibliotekets paket. Det kan även inträffa om
biblioteket byggts i samma källkodspaket och om shlibs-filen
ännu inte har skapats (då måste du fixa debian/rules
så att det skapar shlibs-filen innan det anropar
dpkg-shlibdeps). Felaktig RPATH kan också leda till att
biblioteket hittas under ett icke-kanoniskt namn (till exempel:
/usr/lib/openoffice.org/../lib/libssl.so.9.8 istället för
/usr/lib/libssl.so.0.9.8) som inte associeras till något paket,
dpkg-shlibdeps försöker gå runt detta genom
att falla tillbaka på ett kanoniskt namn (med realpath(3)),
men det fungerar kanske inte alltid. Det är alltid bäst att
städa upp RPATH i binären för att undvika problem.
Om du anropar dpkg-shlibdeps i pratsamt läge (-v)
kommer det ge mycket mer information om var det försökte
hitta beroendeinformationen. Det kan vara användbart om du inte
förstår varför du får felmeddelandet.
deb-substvars(5),
deb-shlibs(5),
deb-symbols(5),
dpkg-gensymbols(1).
Peter Krefting och Daniel Nylander.