Hur man arbetar med delade objekt (bibliotek) beroenden i Linux

0
173
Dima Polies/Shutterstock.com

Fel vid laddning av delade bibliotek: det fruktade felet som alla Linux-användare förr eller senare stöter på. Något gick fel med de delade objektberoenden (biblioteken) som används av den körbara filen. Lär dig hur du åtgärdar sådana problem och mer!

Vad är en Delat objektberoende ?

Ett delat objekt (även kallat ett bibliotek) är ett binärt (vanligtvis inte direkt körbart) som används av flera program/applikationer i en Linux-instans. Sådana bibliotek installeras ofta på operativsystemsnivå och delas (därav namnet delat objekt eller bibliotek) för användning av ett eller flera (och till och med många) direkt körbara applikationer.

Till exempel kan ett program som innehåller komprimeringsfiler kräva att biblioteket bz2 (bzip2) libbz2.so.1.0 gör det. Termen bibliotek används oftare i Linux-cirklar och är den föredragna lingo bland yrkesverksamma, även om delat objekt (och delat bibliotek ) båda är tekniskt korrekta. Det är också intressant att notera att .so-filändelsen som används i många bibliotek står för delat objekt !

En körbar kan ha noll, ett eller många bibliotek som den är beroende av. Ju färre bibliotek, desto mer framåt (till exempel när du uppgraderar ditt operativsystem) blir kompatibiliteten. Ju fler bibliotek, desto större är chansen att något bibliotekberoende förr eller senare kommer att brytas. Det är också därför som applikationsleverantörer ibland väljer att släppa statiskt sammanställda binärer snarare än dynamiskt kompilerade binärer.

Skillnaden mellan statiskt och dynamiskt sammanställda binärer är enkel men har långtgående konsekvenser. En statiskt kompilerad binär har biblioteken (tillgängliga i utvecklingssystemet vid tidpunkten för kompileringen) sammanställts till den resulterande binära/körbara. En dynamiskt kompilerad binär kommer att använda biblioteken installerade, tillgängliga och delade på användarens system.

Som du kan se omedelbart skulle detta kräva att användaren installerar sådana beroenden som krävs, såvida inte detta tas om hand i operativsystemet eller applikationsleverantörens pakethanteringssystem och detaljer. Det är därför som man kör ett enkelt kommando som sudo apt install … some_app … ofta ger en uppsättning andra relaterade saker (dvs. nödvändiga bibliotek) som ska saminstalleras samtidigt.

Båda statisk och dynamisk kompilering har fördelar och nackdelar. Om du till exempel använder statisk kompilering och ett bibliotek som du har inkluderat i ditt programvarupaket (ur en programvaruleverantörs perspektiv) nu har ett säkerhetsfel eller en kritisk uppdatering, kommer det troligen att innebära att du måste -släpp ditt programpaket, även om ingenting har förändrats i din kod.

Annons

Men då är det inte heller idealt att förlita sig på användaren för att installera bibliotek, särskilt för komplexa program, eller när det krävs självkompilering av programvara, med insikten att slutanvändare ofta kämpar med sådana saker. Det är ett komplext område och frågan har diskuterats ofta.

Vid tillämpningen av denna artikel kommer vi att titta på delade bibliotek i samband med ett program som har sammanställts dynamiskt, vilket ofta är fallet med operativsystemsprogram/körbara filer/verktyg. Med statiskt kompilerade program (som är mindre vanliga), ett fel som & # 8216; Fel vid inläsning av delade bibliotek & # 8217; är mycket osannolikt att visas, eftersom biblioteken ingår i den körbara filen såvida inte programmet är delvis dynamiskt och endast innehåller en begränsad uppsättning inbyggda statiska bibliotek.

Fel vid laddning av delade bibliotek!

Låt oss växla till root läge ett tag (med sudo su) och utforska hur delade bibliotek fungerar när det gäller ett verktyg som/usr/bin/zip som ingår eller installeras med större Linux-distributioner.

Här ändrade vi kataloger till/usr/bin och kontrollerade om zip-programmet/binärt/körbart är närvarande. Då vi hittade den nuvarande kontrollerade vi versionen genom att åberopa den med –version och endast ta de två översta raderna i utgången genom att pipa utgången (med |) för att undvika den långa utdata som annars ges.

Slutligen använde vi ldd-verktyget (ett program som skriver ut delade objektberoenden) för att se vilka bibliotek den körbara körningen kräver. Som vi kan se kräver programmet fyra delade bibliotek. Listan över obligatoriska bibliotek är vanligtvis i det biblioteksformat som krävs, följt av en sökväg där det namngivna biblioteket redan hittades.

Annons

För vissa toppnivå- eller special OS-nivåbibliotek (som linux-vdso.so.1) visas ingen sådan sökväg. Men så länge inget fel visas för någon post, vet du att det är bra och tillgängligt (eller att föredra). I själva verket är linux-vdso.so.1 ett speciellt virtuellt delat objekt/bibliotek som injiceras i varje process av Linux-kärnan, som inte har en fysisk fil på disken för samma. Det är där för att göra systemsamtal effektivare.

Så, låt oss bryta saker lite och byta namn på ett av de bibliotek som krävs så att det inte längre kan upptäckas automatiskt av binärt:

Som du kan se här har vi bytt namn på/flyttat filen från /lib/x86_64-linux-gnu/libbz2.so.1.0 till /lib/x86_64-linux-gnu/libbz2.so.1.0.NOT_PRESENT. Detta bröt vår zip-applikation, och när vi försöker köra det får vi det fruktade felet när vi läser in delade bibliotek fel. Ser vi lite närmare är felmeddelandet faktiskt ganska beskrivande, dock:

zip: fel vid laddning av delade bibliotek: libbz2.so.1.0: kan inte öppna delad objektfil: Ingen sådan fil eller katalog

En erfaren IT-tekniker kommer alltid att noggrant granska alla loggar och programutdata/information som presenteras för honom eller henne innan han ringer till en fråga. Det skulle också löna sig här, eftersom den nödvändiga filen visas tydligt, libbz2.so.1.0, och problemet visas också tydligt. Det finns ingen sådan fil eller katalog. Med andra ord saknas libbz2.so.1.0!

Vi kan också verifiera detsamma med ldd, vilket framgår av bilden ovan. En tydlig libbz2.so.1.0 = & gt; inte hittas hjälper oss att veta vad som händer. När vi väl förstår hur dynamiskt kompilerade binärfiler (de flesta av binärfilerna i operativsystemet kompileras på detta sätt) laddar och kräver bibliotek, och hur man ser om en saknas (eller informeras om detsamma via felmeddelandet), saker inte & # 8217; ser inte så komplicerat ut längre.

Annons

Vad mer är att när vi känner till det önskade biblioteksnamnet kommer en snabb sökning i din favoritsökmotor att visa det extra paket som ska installeras (eller installeras om) för att få det önskade biblioteksnamnet. Ganska ofta kan paketnamnet till och med tolkas direkt från biblioteksnamnet. Men i det här fallet är namnet på runtime-biblioteket lite förskjutet.

Det finns två typer av bibliotek och runtime-bibliotek och utvecklingsbibliotek. I det här fallet är paketnamnet som innehåller libbz2.so.1.0-biblioteket troligen bzip2, och försök att avinstallera skulle troligtvis bryta olika andra objekt, vilket kan ses från en lång lista med program som kommer att tas bort om man försöker avinstallera eller rensa bzip2-paketet.

Den andra typen av bibliotek är ett utvecklingsbibliotek. Dessa krävs ofta när man försöker kompilera program och är ofta ännu närmare relaterade till deras faktiska biblioteksfilnamn. Till exempel i Ubuntu, ta helt enkelt biblioteksnamnet och lägg till -dev. Om vi ​​till exempel vill installera utvecklingspaketet relaterat till libbz2.so.1.0-paketet kan vi titta på att installera libbz2-dev:

Detta utvecklingsbibliotek är inte direkt relaterat till vårt libbz2.so.1.0 runtime-bibliotek, men det är bra att känna till namngivningssyntaxen för de flesta utvecklingspaketnamnen i Ubuntu (prefix för lib och suffix av -dev med namnet på biblioteket mellan dessa) närhelst ett visst utvecklingsbibliotek krävs (vilket oftast är nödvändigt vid kompilering av programvara).

Antag också att något bibliotek på något sätt blev trasigt. I så fall är en av de enklaste snabbkorrigeringarna att rensa biblioteket sudo apt purge your_library_name command (vilket helt skulle rensa biblioteket/programmet som gått), följt av en ominstallation med sudo apt install your_library_name command.

Och när du stöter på en situation som liknar ovanstående, där avinstallation av runtime-biblioteket kräver avinstallation/rensning av huvudprogrammet, och där en sådan rensning/borttagning är för stor en del av operativsystemet eller skulle påverka för många andra saker, du kan använda ett ominstallationsalternativ istället:

sudo apt installera om bzip2

Det är dock inte alltid så enkelt, även om att veta ovan (och särskilt namngivningskonventionen när det gäller att lägga till -dev) hjälper oerhört mycket vid felsökning av problem och ofta löser problemet direkt.

Det hjälper också mycket att veta hur bibliotek kan kontrolleras med hjälp av ldd, och slutligen, att förstå att ett bibliotek bara är en körbar (men inte direkt). Så fil som lever i en underkatalog till/lib eller i/usr/lib eller annat liknande kataloger.

Ibland kommer bibliotek och/eller paket i konflikt med varandra, eller vissa paket kräver vissa biblioteksversioner, eller vissa bibliotek kräver andra bibliotek, i specifika versioner själva. Ja, det blir lite komplext. Det är också något enkelt, när det blir så komplext, att förstöra ett system. Ibland är det till och med ganska möjligt att helt bryta en operativsystemsinstallation på grund av att ett alltför viktigt bibliotek flyttas etc.

Annons

Ofta är det något säkrare att skapa en symlink (en virtuell länk med ett visst filnamn, som hänvisar/länkar till en annan befintlig fil eller en annan symlink själv, som i sin tur pekar på en riktig fil) för ett saknat bibliotek hos en äldre version, till exempel, och pekar den symlänken till den senaste installerade versionen. Det fungerar inte alltid, men bara om det misslyckas kan symlinket tas bort, förhoppningsvis säkrare (förutsatt att det inte fanns någon sådan symlink eller fil med samma namn i förväg).

Det bästa sättet att felsöka dessa mer komplexa problem är att alltid försöka med en apt (eller ett liknande pakethanteringsverktyg i ditt operativsystem) -baserade lösning först. Vid den här tiden vill du också läsa hur du använder dkpg för att fixa apt, eftersom det visar dig ett mer detaljerat sätt att hantera paket (men var försiktig, eftersom mer kontroll kommer med mer ansvar!).

Om allt annat misslyckas kan du försöka skapa en symlink eller till och med lägga till biblioteksfilen manuellt. (Se till att trippel säkerställa att nedladdad fil är virusfri genom att till exempel kontrollera den med VirusTotal, och det är alltid bäst att använda Linux-leverantörsförråd för att ladda ner binära filer.)

I extremis kan du också hitta ett bibliotek i ett närliggande Linux-operativsystem. Till exempel körs en Ubuntu-körbar på Mint och vice versa. Att kopiera ett bibliotek från en annan dator som du har är också en bra metod ibland.

Wrapping Up

Finkornig bibliotekshantering är en färdighet som det tar en livstid att lära sig. Det är nästan en konst. Den här artikeln har gett grundläggande information/kunskap och verktyg att använda och har listat några mer avancerade felsökningsförslag för när saker blir grumliga, och förr eller senare kommer de att göra om du är en frekvent användare av Linux som regelbundet installerar paket.

När du nästa gång ser & # 8216; Fel vid inläsning av delade bibliotek & # 8217; fel på din Linux-maskin, kommer du att vara bättre rustad att förstå var problemet kan komma från att använda ett verktyg som ldd, som förklaras i den här artikeln. Vi tittade också på statiska kontra dynamiskt sammanställda binärer, och hur delade eller inbyggda bibliotek passar in i och fungerar med båda.

Annons

Om du gillade den här artikeln kanske du också vill läsa artikeln på dpkg länkade ovan samt hur man lägger till universum, multiversum och begränsade arkiv i Ubuntu.