Ich habe eine ausführbare Binärdatei mit dem Namen "alpha", für die eine verknüpfte Bibliothek (libz.so.1.2.7) erforderlich ist, die unter abgelegt wird /home/username/myproduct/lib/libz.so.1.2.7
Ich exportiere dasselbe in meine Terminal-Instanz, bevor ich meine ausführbare Binärdatei durch Ausführen des folgenden Befehls spawne.
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
Wenn ich nun eine andere Anwendung "bravo" spawne, die dieselbe Bibliothek, aber eine andere Version benötigt, dh (libz.so.1.2.8), die in verfügbar ist
/lib/x86_64-linux-gnu/libz.so.1.2.8
, gibt das System den folgenden Fehler aus.
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
Wenn ich das deaktiviere LD_LIBRARY_PATH
, läuft "bravo" gut an. Ich verstehe, dass das obige Verhalten darauf zurückzuführen ist, dass es LD_LIBRARY_PATH
Vorrang vor den in definierten Verzeichnispfaden hat, /etc/ld.so.conf
während nach verknüpften Bibliotheken gesucht wird. Infolgedessen ist der obige Fehler aufgetreten. Ich bin nur neugierig, warum die Entwickler von UNIX / LINUX das Betriebssystem nicht für die Suche nach verknüpften Bibliotheken in anderen Verzeichnissen gemäß der Hierarchie entworfen haben, wenn die erste Instanz der Bibliothek eine andere Version hat.
Vereinfacht gesagt durchlaufen UNIX / LINUX-Systeme eine Reihe von Verzeichnissen, bis die erforderliche Bibliothek gefunden wurde. Aber warum macht es nicht dasselbe, bis es die erwartete Version findet, anstatt die erste Instanz der Bibliothek unabhängig von ihrer Version zu akzeptieren?
quelle
libz.so.1
ist ein Symlink zulibz.so.1.2.8
Antworten:
Soweit bekannt.
zlib.so.1.2.7
undzlib.so.1.2.8
beide haben einen Sonamen vonzlib.so.1
, also sagen deinealpha
und diebravo
Binärdateien, dass sie brauchenzlib.so.1
. Der Dynamic Loader lädt die erste gefundene passende Bibliothek. Es ist nicht bekannt, dass Version 1.2.8 zusätzliche Symbole bereitstellt, diebravo
benötigt werden. (Aus diesem Grund bemühen sich Verteilungen, zusätzliche Abhängigkeitsinformationen anzugeben, z. B.zlib1g (>= 1.2.8)
fürbravo
.)Möglicherweise sollte dies leicht zu beheben sein, aber nicht zuletzt, weil Binärdateien und Bibliotheken die benötigten Symbole getrennt von den benötigten Bibliotheken auflisten, sodass der Loader nicht überprüfen kann, ob eine bestimmte Bibliothek alle diese Symbole enthält werden davon benötigt. Symbole können auf verschiedene Arten bereitgestellt werden, und das Einfügen einer Verknüpfung zwischen Symbolen und den Bibliotheken, die diese bereitstellen, kann vorhandene Binärdateien beschädigen. Es gibt auch den zusätzlichen Spaß, Symbole einzufügen, um die Dinge zu komplizieren (und sicherheitsrelevante Entwickler dazu zu bringen, sich die Haare auszureißen).
Einige Bibliotheken stellen Versionsinformationen bereit, die letztendlich in gespeichert werden
.gnu.version_r
, mit einem Link zur bereitstellenden Bibliothek, der hier hilfreich wäre, aberlibz
keiner von ihnen ist.(Angesichts der Sonamen würde ich erwarten, dass Ihre
alpha
Binärdatei gut funktioniertzlib.so.1.2.8
.)quelle
zlib
wirdlibtool
sowieso nicht verwendet , außer auf Darwin, wo es istar
;-).