Hoe te werken met afhankelijkheden van gedeelde objecten (bibliotheek) in Linux

0
178
Dima Polies/Shutterstock.com< /figure>

Fout bij het laden van gedeelde bibliotheken: de gevreesde fout waar elke Linux-gebruiker vroeg of laat tegenaan zal lopen. Er is iets misgegaan met de gedeelde objectafhankelijkheden (de bibliotheken) die door het uitvoerbare bestand worden gebruikt. Leer hoe u dergelijke problemen en meer kunt oplossen!

Wat is een Afhankelijkheid van gedeeld object?

Een gedeeld object (ook wel een bibliotheek genoemd) is een binair (meestal niet direct uitvoerbaar) bestand dat door meerdere programma's/applicaties op een Linux-instantie wordt gebruikt. Dergelijke bibliotheken worden vaak geïnstalleerd op het niveau van het besturingssysteem en worden gedeeld (vandaar de naam gedeeld object of bibliotheken) voor gebruik door een of meer (en zelfs veel) direct uitvoerbare applicaties.

Bijvoorbeeld, een programma dat bestanden comprimeert, kan de bz2 (bzip2) bibliotheek libbz2.so.1.0 nodig hebben om dit te doen. De term bibliotheek wordt vaker gebruikt in Linux-kringen en is het geprefereerde jargon onder professionals, hoewel gedeeld object (en gedeelde bibliotheek) beide technisch correct zijn. Ook interessant om op te merken is dat de bestandsnaamextensie .so die in veel bibliotheken wordt gebruikt, staat voor gedeeld object!

Een uitvoerbaar bestand kan nul, één of veel bibliotheken hebben waarop het vertrouwt. Hoe minder bibliotheken, hoe verder (bijvoorbeeld bij het upgraden van uw besturingssysteem) de compatibiliteit. Hoe meer bibliotheken, hoe groter de kans dat vroeg of laat een bepaalde bibliotheekafhankelijkheid doorbreekt. Dit is ook de reden waarom applicatieleveranciers soms besluiten om statisch gecompileerde binaire bestanden vrij te geven in plaats van dynamisch gecompileerde binaire bestanden.

Het verschil tussen statisch en dynamisch gecompileerde binaire bestanden is eenvoudig, maar heeft verstrekkende gevolgen. Een statisch gecompileerd binair bestand heeft de bibliotheken (beschikbaar op het ontwikkelaarssysteem op het moment van compileren) gecompileerd in het resulterende binaire/uitvoerbare bestand. Een dynamisch gecompileerd binair bestand gebruikt de bibliotheken die zijn geïnstalleerd, beschikbaar en gedeeld op het systeem van de gebruiker.

Zoals u meteen kunt zien, zou de gebruiker dergelijke vereiste afhankelijkheden moeten installeren, tenzij hetzelfde wordt geregeld in het pakketbeheersysteem en de details van het besturingssysteem of de leverancier van de toepassing. Dit is de reden waarom het uitvoeren van een eenvoudige opdracht zoals sudo apt install …some_app… vaak een reeks andere gerelateerde dingen (dwz vereiste bibliotheken) oplevert die tegelijkertijd moeten worden geïnstalleerd.

Beide statisch en dynamisch compileren hebben voor- en nadelen. Als u bijvoorbeeld statische compilatie gebruikt en een bibliotheek die u in uw softwarepakket hebt opgenomen (vanuit het perspectief van een softwareleverancier) nu een beveiligingsfout of kritieke update heeft, betekent dit waarschijnlijk dat u opnieuw moet -laat uw softwarepakket los, zelfs als er niets in uw code is veranderd.

Advertentie

Maar nogmaals, vertrouwen op de gebruiker om bibliotheken te installeren, vooral voor complexe programma's, of wanneer zelfcompilatie van software vereist is, met het besef dat eindgebruikers vaak met dergelijke dingen worstelen, is ook niet ideaal. Het is een complex gebied en het probleem is vaak besproken.

Voor de doeleinden van dit artikel zullen we kijken naar gedeelde bibliotheken in verband met een programma dat dynamisch is gecompileerd, zoals vaak het geval is met besturingssysteemprogramma's/uitvoerbare bestanden/tools. Bij statisch gecompileerde programma's (die minder vaak voorkomen), kan een fout als ‘Fout tijdens het laden van gedeelde bibliotheken’ wordt hoogstwaarschijnlijk niet weergegeven, aangezien de bibliotheken zijn opgenomen in het uitvoerbare bestand, tenzij het programma deels dynamisch is en slechts een beperkte set ingebouwde statische bibliotheken bevat.

Fout bij het laden van gedeelde bibliotheken!

Laten we overschakelen naar rootmodus een tijdje (met sudo su) en ontdek hoe gedeelde bibliotheken werken als het gaat om een ​​tool als /usr/bin/zip die is inbegrepen bij of kan worden geïnstalleerd bij grote Linux-distributies.

Hier hebben we de mappen gewijzigd in /usr/bin en gecontroleerd of het zip-programma/binary/executable is aanwezig. Toen we het aanwezig vonden, hebben we de versie gecontroleerd door het aan te roepen met –version en alleen de bovenste twee regels van de uitvoer te nemen door de uitvoer te pipen (met behulp van |) om de lange uitvoer die anders wordt gegeven te vermijden.

Ten slotte gebruikten we de ldd-tool (een programma dat gedeelde objectafhankelijkheden afdrukt) om te zien welke bibliotheken het uitvoerbare bestand nodig heeft. Zoals we kunnen zien, vereist het programma vier gedeelde bibliotheken. De lijst met benodigde bibliotheken heeft meestal de indeling van de benodigde bibliotheek, gevolgd door een pad waar de genoemde bibliotheek al is gevonden.

Advertentie

Voor sommige bibliotheken op het hoogste of speciale besturingssysteem (zoals linux-vdso.so.1) wordt zo'n pad niet getoond. Zolang er echter geen fout wordt weergegeven voor een item, weet u dat het goed is en beschikbaar (of liever). In feite is linux-vdso.so.1 een speciaal virtueel gedeeld object/bibliotheek die in elk proces wordt geïnjecteerd door de Linux Kernel, die daarvoor geen fysiek bestand op schijf heeft. Het is er om systeemoproepen efficiënter te maken.

Dus laten we de zaken een beetje breken en een van de vereiste bibliotheken hernoemen zodat deze niet langer automatisch kan worden ontdekt door de binair:

Zoals je kunt zien, hebben we het bestand hier hernoemd/verplaatst van /lib/x86_64-linux-gnu/libbz2.so.1.0 naar /lib/x86_64-linux-gnu/libbz2.so.1.0.NOT_PRESENT. Dit brak onze zip-applicatie en wanneer we het proberen uit te voeren, krijgen we de gevreesde fout tijdens het laden van gedeelde bibliotheken. Als we wat beter kijken, is de foutmelding eigenlijk vrij beschrijvend, maar:

zip: fout bij het laden van gedeelde bibliotheken: libbz2.so.1.0: kan het gedeelde objectbestand niet openen: geen dergelijk bestand of map

Een doorgewinterde IT-engineer zal altijd zorgvuldig alle logboeken en programma-uitvoer/informatie die aan hem of haar wordt gepresenteerd, bekijken voordat hij of zij een oproep doet over een probleem. Het zou hier ook zijn vruchten afwerpen, omdat het vereiste bestand duidelijk wordt weergegeven, libbz2.so.1.0, en het probleem ook duidelijk wordt weergegeven. Er is geen dergelijk bestand of map. Met andere woorden, libbz2.so.1.0 ontbreekt!

We kunnen hetzelfde ook verifiëren met ldd, zoals te zien is in de afbeelding hierboven. Een duidelijke libbz2.so.1.0 => niet gevonden helpt ons om te weten wat er gebeurt. Als we eenmaal duidelijk begrijpen hoe dynamisch gecompileerde binaire bestanden (de meeste binaire bestanden in het besturingssysteem zijn op deze manier gecompileerd) bibliotheken laden en nodig hebben, en hoe we kunnen zien of er een ontbreekt (of hiervan op de hoogte wordt gesteld via de foutmelding), gaan dingen niet #8217; ziet er niet meer zo ingewikkeld uit.

Advertentie

Wat meer is, is dat zodra we de vereiste bibliotheeknaam weten, een snelle zoekopdracht in uw favoriete zoekmachine het extra pakket zal tonen dat moet worden geïnstalleerd (of opnieuw moet worden geïnstalleerd) om de vereiste bibliotheeknaam te verkrijgen. Heel vaak kan de pakketnaam zelfs rechtstreeks uit de bibliotheeknaam worden afgeleid. In dit geval is de naam voor de runtime-bibliotheek echter een beetje verschoven.

Er zijn twee soorten bibliotheken: runtime-bibliotheken en ontwikkelingsbibliotheken. In dit geval is de pakketnaam die de bibliotheek libbz2.so.1.0 bevat waarschijnlijk bzip2, en proberen te verwijderen zou waarschijnlijk verschillende andere items breken, zoals kan worden gezien uit een lange lijst met programma's die worden verwijderd als men probeert te verwijderen of verwijder het bzip2-pakket.

Het tweede type bibliotheek is een ontwikkelingsbibliotheek. Deze zijn vaak nodig bij het compileren van programma's en zijn vaak nog nauwer verwant aan hun daadwerkelijke bibliotheekbestandsnamen. Neem in Ubuntu bijvoorbeeld gewoon de bibliotheeknaam en voeg -dev toe. Als we bijvoorbeeld het ontwikkelpakket met betrekking tot het libbz2.so.1.0-pakket willen installeren, kunnen we kijken naar het installeren van libbz2-dev:

Terwijl deze ontwikkelbibliotheek niet direct gerelateerd is aan onze libbz2.so.1.0 runtime-bibliotheek, is het handig om de naamgevingssyntaxis te kennen van de meeste ontwikkelpakketnamen in Ubuntu (voorvoegsel van lib en het achtervoegsel van -dev met de naam van de bibliotheek ertussen) voor wanneer een bepaalde ontwikkelingsbibliotheek vereist is (wat meestal nodig is bij het compileren van software).

Stel ook dat een bibliotheek op de een of andere manier kapot is gegaan. In dat geval is een van de gemakkelijkste snelle oplossingen het opschonen van de opdracht bibliotheek sudo apt purge your_library_name (waardoor de doorgegeven bibliotheek/het doorgegeven programma volledig wordt gewist), gevolgd door een herinstallatie met de opdracht sudo apt install your_library_name.

En wanneer u een situatie tegenkomt die vergelijkbaar is met de bovenstaande, waarbij het verwijderen van de runtime-bibliotheek het verwijderen/opschonen van het hoofdprogramma vereist, en waar een dergelijk opschonen/verwijderen een te groot deel van het besturingssysteem is of te veel andere dingen zou beïnvloeden, kan in plaats daarvan een herinstallatie-optie gebruiken:

sudo apt install bzip2

Het is echter niet altijd zo eenvoudig, hoewel het kennen van het bovenstaande (en vooral de naamgevingsconventie in termen van het toevoegen van -dev) enorm helpt bij het oplossen van problemen en het probleem vaak direct zal oplossen.

Het helpt ook veel om te weten hoe bibliotheken kunnen worden gecontroleerd met behulp van ldd, en ten slotte, te begrijpen dat een bibliotheek slechts een uitvoerbaar (hoewel niet direct) .so-bestand is dat in een submap van /lib of in /usr/lib of andere staat vergelijkbare mappen.

Soms conflicteren bibliotheken en/of pakketten met elkaar, of hebben bepaalde pakketten bepaalde bibliotheekversies nodig, of bepaalde bibliotheken hebben andere bibliotheken nodig, bij specifieke versies zelf. Ja, het wordt een beetje ingewikkeld. Het is ook enigszins gemakkelijk, wanneer het zo complex wordt, om een ​​systeem een ​​beetje te verknoeien. Soms is het zelfs heel goed mogelijk om de installatie van een besturingssysteem volledig te verbreken vanwege het verplaatsen van een te belangrijke bibliotheek, enz.

Advertentie

Vaak is het wat veiliger om een ​​symlink (een virtuele link met een bepaalde bestandsnaam, die verwijst naar/linkt naar een ander bestaand bestand of een andere symlink zelf, die op zijn beurt naar een echt bestand verwijst) te maken voor een ontbrekende bibliotheek op een oudere versie, bijvoorbeeld, en die symbolische link naar de laatst geïnstalleerde versie te verwijzen. Het werkt niet altijd, maar voor het geval het mislukt, kan de symbolische link worden verwijderd, hopelijk veiliger (ervan uitgaande dat er van tevoren niet zo'n symbolische link of bestand met dezelfde naam bestond).

De beste manier om deze meer complexe problemen op te lossen, moet u altijd eerst een op apt (of een vergelijkbare pakketbeheertool op uw besturingssysteem) gebaseerde oplossing proberen. Op dit punt wil je ook lezen hoe je dkpg gebruikt om apt te repareren, omdat het je een meer gedetailleerde manier laat zien om pakketten te beheren (wees voorzichtig, want meer controle gaat gepaard met meer verantwoordelijkheid!).

Als al het andere faalt, probeer dan een symbolische link te maken of voeg het bibliotheekbestand zelfs handmatig toe. (Zorg er a.u.b. driemaal voor dat elk gedownload bestand virusvrij is door het bijvoorbeeld te controleren met VirusTotal, en het is altijd het beste om de door de leverancier geleverde opslagplaatsen van Linux te gebruiken om binaire bestanden te downloaden.)

In extremis kunt u mogelijk ook een bibliotheek vinden in een naburig Linux-besturingssysteem. Een uitvoerbaar bestand van Ubuntu zal bijvoorbeeld op Mint draaien en vice versa. Het kopiëren van een bibliotheek van een andere pc die u heeft, is soms ook een haalbare aanpak.

Wrapping Up

Fijn gestructureerd bibliotheekbeheer is een vaardigheid die een leven lang duurt om te leren. Het is bijna een kunst. Dit artikel heeft de basisinformatie/knowhow en hulpmiddelen gegeven om te gebruiken en heeft enkele meer geavanceerde suggesties voor probleemoplossing opgesomd voor wanneer dingen duister worden, en vroeg of laat zullen ze dat doen als je een frequente gebruiker van Linux bent die regelmatig installeert pakketten.

Wanneer u de volgende keer de ‘Fout bij het laden van gedeelde bibliotheken’ fout op uw Linux-machine, bent u beter toegerust om te begrijpen waar het probleem vandaan kan komen met behulp van een tool zoals ldd, zoals uitgelegd in dit artikel. We hebben ook gekeken naar statische versus dynamisch gecompileerde binaire bestanden, en hoe gedeelde of ingebouwde bibliotheken in beide passen en ermee werken.

Advertentie

Als je dit artikel leuk vond, zou je het misschien ook leuk vinden om het artikel te lezen op dpkg die hierboven is gelinkt, evenals Hoe u de Universe, Multiverse en Restricted Repositories in Ubuntu kunt toevoegen.