Finden Sie heraus, ob sich die Bibliothek im Pfad befindet

12

Angenommen, ich möchte testen, ob eine Bibliothek installiert und von einem Programm verwendbar ist. Ich kann verwenden ldconfig -p | grep mylib, um herauszufinden, ob es auf dem System installiert ist. aber was ist, wenn die Bibliothek nur über die Einstellung bekannt ist LD_LIBRARY_PATH?

In diesem Fall kann das Programm die Bibliothek möglicherweise finden, wird dies jedoch ldconfignicht tun. Wie kann ich überprüfen, ob sich die Bibliothek im kombinierten Linkerpfad befindet?

Ich möchte hinzufügen, dass ich nach einer Lösung suche, die auch dann funktioniert, wenn ich das Programm nicht zur Hand habe (z. B. das Programm ist noch nicht kompiliert). Ich möchte nur wissen, dass eine bestimmte Bibliothek in ld'vorhanden ist. s Pfade.

nbubis
quelle
2
Sie können ldd <binary>damit überprüfen, ob sich alle verknüpften Bibliotheken im Pfad befinden. Vielleicht gibt es einen eleganteren Weg.
Thomas
@ Thomas Ich denke, Sie sollten eine Antwort auf Ihren Kommentar machen. ldddient genau diesem Zweck.
Lgeorget
1
@Thomas - aber was ist, wenn ich das Programm noch nicht kompiliert habe und diese Bibliothek zum Kompilieren benötigt wird?
Nbubis
@ Igeorget - siehe meine Bearbeitung / Kommentar
nbubis
@nbubis: Wenn Sie die Bibliothek zum Kompilieren benötigen, müssen Sie normalerweise eine LIBRARY_PATHUmgebungsvariable verwenden, die z gcc. B. vom Compiler nachgeschlagen wird . Die LIBRARY_PATHUmgebungsvariable verfügt auch über eine durch Doppelpunkte getrennte Liste von Verzeichnissen.
Thomas

Antworten:

14

ldconfig kann alle Bibliotheken auflisten, auf die es Zugriff hat. Diese Bibliotheken werden auch in ihrem Cache gespeichert.

/sbin/ldconfig -v -Ncrawlt alle üblichen Bibliothekspfade, listet alle verfügbaren Bibliotheken auf, ohne den Cache zu rekonstruieren (was nicht möglich ist, wenn Sie kein Root-Benutzer sind). Bibliotheken in LD_LIBRARY_PATH werden NICHT berücksichtigt (im Gegensatz zu dem, was in diesem Beitrag vor der Bearbeitung gesagt wurde). Sie können jedoch zusätzliche Bibliotheken an die Befehlszeile übergeben, indem Sie die folgende Zeile verwenden:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
lgeorget
quelle
ldconfig ist ein Tool aus den 1980er Jahren, das in den 1990er Jahren aufgegeben wurde. Aus diesem Grund ldconfigist es nicht portabel, da es nur für Implementierungen gilt, die auf dem SunOS-4.0- a.outbasierten dynamischen Linker von 1987 basieren.
Schily
Wie hilft das beim Auflisten von Bibliotheken, die sich nur auf LD_LIBRARY_PATH befinden? Ich denke, ich könnte ein Skript schreiben, um das zu analysieren und es dann über ldconfig zu lesen, aber es scheint ein bisschen wie ein Over-Kill.
Nbubis
1
@nbubis Sie können die Bibliotheken in LD_LIBRARY_PATH jederzeit an ldconfig übergeben. Wie /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)nicht zu viel von einem Overkill nach meinem Geschmack.
Lgeorget
@schily Wirklich? Soweit ich das beurteilen kann, funktioniert es ziemlich gut mit ELF-Bibliotheken. Und es wird immer noch verwendet. Ld.so basiert auf dem von ldconfig erstellten Cache.
Lgeorget
Die Linux-Leute haben den alten Sun Linker-Quellcode gehackt, um ELF zu unterstützen. Die neue ELF-Implementierung von Sun wurde ldconfigin einer Vereinbarung mit AT & T entfernt, da das Linker-Caching zu fehlerempfindlich war. Sun später hinzugefügt the tree stooges: moe, lariund crleals Hilfsprogramme für ELF - Management.
schily
2

Ersetzen Sie :LD_LIBRARY_PATH global durch (Leerzeichen)

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
Fizwit
quelle
2

Sie können ein einfaches Testprogramm mit gcc kompilieren und Ihre Bibliothek verknüpfen. Dann können Sie die verwendeten Bibliotheken mit ldd überprüfen. Ich benutze so etwas:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed verhindert, dass der Linker die Bibliothek verwirft, da keine Symbole aus der Bibliothek verwendet werden.

Guini
quelle