Wie entscheidet eine Unix-Binärdatei, wo eine gemeinsam genutzte Bibliothek abgerufen werden soll?

2012
Aftershock

Ich verwende eine ausführbare Linux-Datei, die Bibliotheken befinden sich an vielen Stellen. Ich meine die gleiche Bibliothek mit anderer Version. Das Problem ist, dass die ausführbare Datei die ausführbare Datei in einer falschen Bibliothek aufnimmt. Das Betriebssystem ist Ubuntu 64 Bit.

Die Bibliotheken befinden sich in / usr / local / lib und / usr / lib / x86_64-linux-gnu. Ich möchte, dass die Version / usr / local / lib verwendet wird.

Um die Verwendung der Version / usr / local / lib zu erzwingen. Ich kopierte die .so von dort nach / usr / lib / x86_64-linux-gnu und löschte dort die verwiesene .so. Das Ergebnis war, dass die Software (VLC) die neu kopierten Bibliotheken nicht verwendete, aber nicht mehr ordnungsgemäß funktionierte und die Bibliothek überhaupt nicht fand. Trotz der Tatsache war es dort drüben. Daher ist nicht klar, wie VLC entscheidet, welche Bibliothek verwendet werden soll.

Es ist klar, dass die Dateien unter /etc/ld.so.conf.d verwendet werden, um die Bibliothekspfade abzurufen. (Dateien enthalten / usr / local / lib und / usr / lib / x86_64-linux-gnu) Warum wählt sie nicht die Bibliothek aus, die ich unter / usr / lib / x86_64-linux-gnu oder unter / usr / local / lib kopiert habe?

LD_LIBRARY_PATH ist nicht festgelegt.

Aktualisieren:

Ich dachte, ich könnte einfach eine andere Version hinzufügen, das Programm würde das verwenden, aber es scheint, dass die Version der Bibliothek zur Kompilierzeit für die angegebene ausführbare Datei festgelegt ist. Die neue Version wird also nicht verwendet, nur weil ich eine alte lösche.

2
LD_LIBRARY_PATH ist nicht festgelegt. <- das ist dein Problem Gung Foo vor 11 Jahren 0
Warum sagst du das? Aftershock vor 11 Jahren 0
denn hier wird nach Bibliotheken gesucht. Gung Foo vor 11 Jahren 0
Sind diese Dinge nicht festgelegt, wenn das Programm kompiliert und verlinkt wird? Bitte geben Sie weitere Details an, einschließlich spezifischer Fehler und der betreffenden Bibliothek. Ярослав Рахматуллин vor 11 Jahren 0
Ja, ich dachte, ich könnte einfach eine andere Version hinzufügen, das Programm würde dies verwenden, aber es scheint, dass die Version der Bibliothek zur Kompilierzeit festgelegt ist. Die neue Version wird also nicht verwendet, nur weil ich eine alte lösche. Aftershock vor 11 Jahren 0

1 Antwort auf die Frage

0
drahnr

Zwei Möglichkeiten, dies zu erreichen

a) Einstellung rpathzur Abendzeit - dies ist ein sehr hässlicher und nicht portabler Weg und sollte nach Möglichkeit vermieden werden

b) Verwenden Sie die LD_LIBRARY_PATHUmgebungsvariable (vergessen Sie nicht, diese zu exportieren, wenn Sie sie ändern!)


Wenn Sie eine bestimmte Version / ein modifiziertes / foo-reason für Ihre Binärdatei verwenden möchten, empfehle ich dies

a) statisch verknüpfen, wenn die Lizenz dies zulässt

b) Verwenden Sie LD_PRELOADwie hier erklärt https://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick

c) Ändern Sie das LD_LIBRARY_PATH(stellen Sie sicher, dass Ihr Pfad der erste in dieser Liste ist, sie werden der Reihe nach durchsucht), indem Sie ein Run-Script verwenden, das dies tut