So arbeiten Sie mit Abhängigkeiten von gemeinsamen Objekten (Bücherei) de Linux

Inhalt

Bibliothekstext auf weißem Hintergrund

Fehler beim Laden gemeinsam genutzter Bibliotheken: der gefürchtete Fehler, der früher oder später jedem Linux-Benutzer begegnen wird. Bei den Abhängigkeiten von gemeinsamen Objekten ist ein Fehler aufgetreten (Die Bibliotheken) von der ausführbaren Datei verwendet. Erfahren Sie, wie Sie diese und mehr Probleme beheben können!!

Was ist ein Abhängigkeit von gemeinsamen Objekten?

Ein gemeinsames Objekt (auch Bibliothek genannt) ist eine binäre (generell nicht direkt ausführbar) von mehreren Programmen verwendet / Anwendungen auf einer Linux-Instanz. Diese Bibliotheken werden häufig auf Betriebssystemebene installiert und gemeinsam genutzt (daher der Name gemeinsames Objekt Ö libraries) zur Nutzung durch einen oder mehrere (und sogar viele) direkt ausführbare Anwendungen.

Als Beispiel, ein Programm, das komprimierte Dateien enthält, benötigt möglicherweise die bz2-Bibliothek (bzip2) libbz2.so.1.0 es zu tun. Der Begriff Bücherei Es wird in Linux-Kreisen häufiger verwendet und ist der Fachjargon der Wahl, obwohl gemeinsames Objekt (und gemeinsam genutzte Bibliothek) sind beide technisch korrekt. Interessant ist auch, dass die .so Die in vielen Bibliotheken verwendete Dateinamenerweiterung bedeutet gemeinsames Objekt!

Eine ausführbare Datei kann null haben, eine oder mehrere Bibliotheken, auf denen sie basiert. Je weniger Bibliotheken, fortgeschrittener (beim Aktualisieren Ihres Betriebssystems, als Beispiel) wird kompatibel sein. Je mehr Bibliotheken, desto größer ist die Chance, dass, früher oder später, jegliche Abhängigkeit von der Bibliothek ist gebrochen. Dies ist auch der Grund, warum sich Anwendungsanbieter manchmal für den Start entscheiden statically compiled binaries Anstatt von dynamically compiled binaries.

Der Unterschied zwischen statisch und dynamisch kompilierten Binärdateien ist einfach, hat aber weitreichende Konsequenzen. Eine statisch kompilierte Binärdatei hat die Bibliotheken (zur Build-Zeit im Entwicklungssystem verfügbar) binär kompiliert / resultierende ausführbare Datei. Eine dynamisch kompilierte Binärdatei verwendet die installierten Bibliotheken, verfügbar und auf dem System des Benutzers geteilt.

Wie man sofort sieht, Dies würde erfordern, dass der Benutzer die erforderlichen Abhängigkeiten installiert, Sofern diese nicht im Betriebssystem oder im Detail- und Paketverwaltungssystem des Anwendungsherstellers gepflegt sind. Aus diesem Grund führen Sie einen einfachen Befehl wie aus sudo apt install ...some_app... wird oft eine Reihe anderer zugehöriger Dinge produzieren (Mit anderen Worten, erforderliche Bibliotheken) gleichzeitig mitinstalliert werden.

Sowohl statische als auch dynamische Kompilierung haben Vor- und Nachteile. Als Beispiel, wenn Sie statische Kompilierung und eine Bibliothek verwenden, die Sie in Ihrem Softwarepaket enthalten haben (aus Sicht eines Softwareherstellers) jetzt haben Sie einen Sicherheitsfehler oder ein kritisches Update, Möglicherweise müssen Sie Ihr Softwarepaket erneut veröffentlichen, auch wenn sich an deinem Code nichts geändert hat.

Aber, wieder, Vertrauen Sie dem Benutzer, um Bibliotheken zu installieren, speziell für komplexe Programme, oder wenn eine automatische Softwarekompilierung erforderlich ist, wissend, dass Endanwender oft mit solchen Dingen zu kämpfen haben, es ist auch nicht optimal. Es ist ein komplexes Gebiet und das Thema wurde oft diskutiert.

Für die Zwecke dieses Beitrags, wir analysieren die Shared Libraries in Verbindung mit einem dynamisch kompilierten Programm, wie es bei Programmen üblich ist / ausführbare Dateien / Betriebssystem-Tools. Mit statisch kompilierten Programmen (die sind weniger verbreitet), Es ist sehr unwahrscheinlich, dass ein Fehler wie 'Fehler beim Laden gemeinsam genutzter Bibliotheken' angezeigt wird, da Bibliotheken in der ausführbaren Datei enthalten sind, es sei denn, das Programm ist teilweise dynamisch und enthält nur einen begrenzten Satz eingebauter Dateien. in statischen Bibliotheken.

Fehler beim Laden gemeinsam genutzter Bibliotheken!

Wechseln wir zu Wurzel Modus für eine Weile (mit sudo su) und erkunden Sie, wie gemeinsam genutzte Bibliotheken funktionieren, wenn es um ein Tool wie . geht /usr/bin/zip die enthalten ist oder mit den wichtigsten Linux-Distributionen installiert werden kann.

Verwenden von ldd unter Linux

Hier, Wir ändern die Verzeichnisse auf /usr/bin und überprüft, ob die zip Programm / Spuren / ausführbare Datei ist vorhanden. Finde es präsent, dann überprüfen wir die Version, indem wir sie aufrufen mit --version und nur die oberen beiden Zeilen der Ausgabe nehmen, um die Ausgabe zu kanalisieren (mit |) um lange Ausgaben zu vermeiden, die sonst gegeben sind.

Beenden, wir nehmen das ldd Werkzeug (ein Programm, das gemeinsame Objektabhängigkeiten druckt) um zu sehen, welche Bibliotheken die ausführbare Datei benötigt. Wie wir sehen können, das Programm benötigt vier Shared Libraries. Die Liste der benötigten Bibliotheken hat in der Regel das Format der benötigten Bibliothek, gefolgt von einem Pfad, in dem die genannte Bibliothek bereits gefunden wurde.

Für einige Top-Level- oder spezielle OS-Level-Bibliotheken (Was linux-vdso.so.1), keine solche Route wird angezeigt. Trotz dieses, solange bei keiner Eingabe ein Fehler angezeigt wird, Sie werden wissen, dass es gut und verfügbar ist (oder ist es vorzuziehen). Genau genommen, linux-vdso.so.1 Es ist ein Objekt / spezielle gemeinsam genutzte virtuelle Bibliothek, die vom Linux-Kernel in jede Prozedur eingefügt wird, Sie haben dafür keine physische Datei auf der Festplatte. Es ist da, um Systemaufrufe effizienter zu machen.

Dann, lass uns die Dinge ein wenig auflösen und eine der erforderlichen Bibliotheken umbenennen, damit die Binärdatei sie nicht mehr automatisch erkennen kann:

Fehler beim Laden gemeinsam genutzter Bibliotheken und fehlende Bibliothek

Wie du siehst, hier ändern wir den namen / Wir haben die Datei verschoben von /lib/x86_64-linux-gnu/libbz2.so.1.0 zum /lib/x86_64-linux-gnu/libbz2.so.1.0.NOT_PRESENT. Das hat unsere Zip-App kaputt gemacht, und wenn wir versuchen es auszuführen, wir bekommen die gefürchteten error while loading shared libraries Error. Trotz dieses, schaue ein bisschen genauer hin, die fehlermeldung ist recht anschaulich:

Postleitzahl: Fehler beim Laden von Shared Libraries: libbz2.so.1.0: kann die freigegebene Objektdatei nicht öffnen: Keine solche Datei oder Ordner

Jeder Check-in und Check-out wird immer sorgfältig von einem erfahrenen IT-Ingenieur überprüft / Programminformationen, die Ihnen vor einem Anruf über ein Hindernis angezeigt werden. Auch hier würde es sich lohnen, da die gewünschte Datei übersichtlich angezeigt wird, libbz2.so.1.0, und das Problem wird auch deutlich gezeigt. Es gibt No such file or directory. Mit anderen Worten, libbz2.so.1.0 Er ist verloren!

Das können wir auch mit verifizieren ldd, wie auf dem bild oben zu sehen. Eine Reinigung libbz2.so.1.0 => not found hilft uns zu wissen, was passiert. Sobald wir klar verstehen, wie dynamisch kompilierte Binärdateien (die meisten Binärdateien im Betriebssystem werden auf diese Weise kompiliert) Bibliotheken laden und benötigen, und wie man sieht, ob einer fehlt (oder wenn Sie durch die Fehlermeldung darauf hingewiesen werden), die dinge funktionieren nicht. es scheint nicht mehr so ​​kompliziert zu sein.

Zur selben Zeit, sobald wir den Namen der gewünschten Bibliothek kennen, eine schnelle Suche in Ihrer bevorzugten Suchmaschine zeigt das zu installierende Add-on-Paket an (werde es neu installieren) um den erforderlichen Bibliotheksnamen zu erhalten. Sehr oft, der Paketname kann sogar direkt aus dem Bibliotheksnamen aufgebaut werden. Trotz dieses, für diesen Fall, der Name der Laufzeitbibliothek ist etwas daneben.

Es gibt zwei Arten von Bibliotheken: Laufzeitbibliotheken und Entwicklungsbibliotheken. Unter diesen Umständen, der Name des Pakets, das die . enthält libbz2.so.1.0 die Bibliothek ist wahrscheinlich bzip2, und der Versuch, die Installation zu deinstallieren, würde wahrscheinlich mehrere andere Elemente zerstören, wie Sie an einer langen Liste von Programmen sehen können, die entfernt werden, wenn Sie versuchen, das Programm zu deinstallieren oder zu bereinigen bzip2 Paket.

Der zweite Bibliothekstyp ist eine Entwicklungsbibliothek. Häufig, Diese werden benötigt, wenn Sie versuchen, Programme zu kompilieren und, häufig, sind enger mit den Namen der eigentlichen Bibliotheksdateien verwandt. Als Beispiel, unter Ubuntu, Nimm einfach den Namen der Bibliothek und füge hinzu -dev. Als Beispiel, wenn wir das Entwicklungspaket für die Installation installieren wollten libbz2.so.1.0 Paket, Wir könnten eine Installation in Betracht ziehen libbz2-dev:

Installieren einer Entwicklungsbibliothek

Da diese Entwicklungsbibliothek nicht direkt mit unserer libbz2.so.1.0 Laufzeitbibliothek, Es ist hilfreich, die Benennungssyntax der meisten Entwicklungspaketnamen in Ubuntu zu kennen (Präfix von lib und Suffix von -dev mit dem Namen der Bibliothek darunter) definitiv, dass eine bestimmte Entwicklungsbibliothek erforderlich ist (was normalerweise beim Kompilieren von Software erforderlich ist).

Zur selben Zeit, Angenommen, irgendeine Bibliothek bricht irgendwie zusammen. Dann, Eine der einfachsten schnellen Lösungen besteht darin, die Bibliothek zu bereinigen sudo apt purge your_library_name Befehl (das würde die Bibliothek total säubern / vergangenes Programm), gefolgt von einer Neuinstallation mit dem sudo apt install your_library_name Befehl.

Und wenn Sie sich in einer ähnlichen Situation wie der vorherigen befinden, wo Sie die Laufzeitbibliothek deinstallieren können, die Sie deinstallieren müssen / das Hauptprogramm löschen, und wo wird gespült / Das Entfernen ist ein zu großer Teil des Betriebssystems oder es würde viele andere Dinge beeinflussen, Sie können stattdessen eine Neuinstallationsoption verwenden:

Eine App oder Bibliothek neu installieren

sudo apt neu installieren bzip2

Trotz dieses, es ist nicht immer so einfach, auch wenn du das oben genannte weißt (und vor allem die Namenskonvention in Bezug auf das Hinzufügen -dev) hilft enorm bei der Behebung von Problemen und, häufig, wird das Problem direkt lösen.

Es hilft auch sehr zu wissen, wie Bibliotheken überprüft werden können lddund, beenden, verstehen, dass eine Bibliothek nur eine ausführbare Datei ist (auch wenn nicht direkt) .so Datei, die in einem Unterverzeichnis von lebt /lib o de /usr/lib oder ähnliche Verzeichnisse.

Manchmal, Bibliotheken und / oder Pakete kollidieren miteinander, oder bestimmte Pakete erfordern bestimmte Versionen von Bibliotheken, oder bestimmte Bibliotheken erfordern andere Bibliotheken, in bestimmten Versionen. Jawohl, es wird etwas komplex. Es ist auch etwas Einfaches, wenn es so komplex wird, ein System ein bisschen durcheinander bringen. Manchmal, es ist sogar durchaus machbar, die Installation eines Betriebssystems wegen der Übertragung einer zu wichtigen Bibliothek komplett zu unterbrechen, etc.

Häufig, es ist etwas sicherer, einen symbolischen Link zu erstellen (ein virtueller Link mit einem bestimmten Dateinamen, Hexe bezieht sich auf / Links zu einer anderen vorhandenen Datei oder einem anderen symbolischen Link selbst, was wiederum auf eine echte Datei verweist) für eine Bibliothek, die in einer früheren Version verbleibt, als Beispiel und verweisen auf diesen symbolischen Link auf die neueste installierte Version. Es funktioniert nicht immer, aber falls es fehlschlägt, der symbolische Link kann entfernt werden, hoffentlich sicherer (vorausgesetzt, dass zuvor kein solcher symbolischer Link oder eine Datei mit demselben Namen existierte).

Der beste Weg, diese komplexeren Probleme zu beheben, besteht darin, immer ein apt (oder ein ähnliches Paketverwaltungstool auf Ihrem Betriebssystem), zuerst eine Lösung. In diesem Punkt, Sie werden auch lesen wollen, wie man dkpg verwendet, um apt zu reparieren, da es Ihnen eine granularere Art der Paketverwaltung zeigt (Auch wenn du vorsichtig bist, denn mehr Kontrolle bedeutet mehr Verantwortung!).

Wenn alle Stricke reißen, Versuchen Sie, einen symbolischen Link zu erstellen, oder fügen Sie die Bibliotheksdatei sogar manuell hinzu. (Bitte, Stellen Sie sicher, dass alle heruntergeladenen Dateien virenfrei sind, als Beispiel, prüfe es mit VirusTotal, und es ist immer besser, die vom Linux-Anbieter bereitgestellten Repositorys zu verwenden, um Binärdateien herunterzuladen).

im Extremfall, es ist möglich, dass Sie auch eine Bibliothek auf einem benachbarten Linux-Betriebssystem finden. Als Beispiel, eine ausführbare Ubuntu-Datei läuft in Mint und umgekehrt. Das Kopieren einer Bibliothek von einem anderen PC, den Sie auch haben, ist manchmal ein praktikabler Ansatz.

Ende

Feinkörniges Bibliotheksmanagement ist eine lebenslange Fähigkeit, die man lernen muss. Es ist fast eine Kunst. Dieser Beitrag hat die Informationen geliefert / grundlegendes Wissen und zu verwendende Tools und hat einige erweiterte Tipps zur Fehlerbehebung aufgelistet, wenn die Dinge trüb werden, und früher oder später, Sie werden es tun, wenn Sie ein häufiger Linux-Benutzer sind und regelmäßig Pakete installieren.

Das nächste Mal wird der Fehler "Fehler beim Laden gemeinsam genutzter Bibliotheken" angezeigt’ auf Ihrem Linux-Rechner, Sie werden besser gerüstet sein, um zu verstehen, woher das Problem kommen kann, wenn Sie ein Tool wie . verwenden ldd, wie in diesem Beitrag erklärt. Wir analysieren auch statische Binärdateien im Vergleich zu dynamisch kompilierten Binärdateien., und wie gemeinsam genutzte oder integrierte Bibliotheken zu beiden passen und mit ihnen arbeiten.

Wenn dir dieser Beitrag gefallen hat, würde auch gerne den Beitrag darüber lesen dpkg zuvor verlinkt, sowie So fügen Sie das Universum hinzu, das Multiversum und die eingeschränkten Repositorys in Ubuntu.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.