Führt LD_LIBRARY_PATH wirklich zu Inkonsistenzen?

8

Der Blog-Artikel " LD_LIBRARY_PATH - oder: Wie bringst du dich selbst in Schwierigkeiten! "vom DTU Computing Center heißt es:

  

3. Inkonsistenz: Dies ist das häufigste Problem. LD_LIBRARY_PATH erzwingt, dass eine Anwendung eine gemeinsam genutzte Bibliothek lädt, mit der sie nicht verknüpft wurde , und das ist höchstwahrscheinlich nicht mit der ursprünglichen Version kompatibel. Dies kann entweder sehr offensichtlich sein, d.h. die Anwendung stürzt ab oder es kann zu falschen Ergebnissen führen, wenn die aufgenommene Bibliothek nicht ganz das tut, was die ursprüngliche Version getan hätte. Besonders letzteres ist manchmal schwer zu debuggen.

Ist das wirklich wahr? Mit LD_LIBRARY_PATH können wir den Suchpfad für dynamische Bibliotheken ändern, aber unterdrückt wirklich die soname Suche, die Binärkompatibilität gewährleistet?

(Nach meiner Interpretation sagt das Programmbibliothek-HOWTO nicht so etwas.)

Oder ist dem Autor das Konzept der Aufrechterhaltung eines konsistenten Bibliotheksversionsschemas nicht bewusst und nimmt man daher an, dass eines für die fragliche Bibliothek nicht verwendet wird?

    
Lightness Races in Orbit 13.08.2013, 10:12
quelle

1 Antwort

5

Ich denke, die LD_LIBRARY sollte nur zum Testen und nicht für eine endgültige Installation verwendet werden, da sie die Verwendung einer bestimmten Bibliothek erlaubt, bevor der Standard-Bibliotheksort verwendet wird. Aber das Linux-Dokumentationsprojekt sagt dies über LD_LIBRARY_PATH und macht es klarer als ich kann.

  

3.3.1. LD_LIBRARY_PATH

     

Sie können vorübergehend eine andere Bibliothek für dieses spezielle ersetzen   Ausführung. In Linux ist die Umgebungsvariable LD_LIBRARY_PATH ein   Doppelpunkt-getrennte Reihe von Verzeichnissen, in denen Bibliotheken gesucht werden sollten   Erstens, vor dem Standardsatz von Verzeichnissen; Dies ist nützlich, wenn   Debuggen einer neuen Bibliothek oder Verwenden einer Nicht-Standard-Bibliothek für spezielle   Zwecke. Die Umgebungsvariable LD_PRELOAD listet gemeinsam genutzte Bibliotheken auf   mit Funktionen, die den Standardsatz überschreiben, so wie   /etc/ld.so.preload tut das. Diese werden vom Loader implementiert   /lib/ld-linux.so. Ich sollte beachten, dass während LD_LIBRARY_PATH arbeitet   viele Unix-ähnliche Systeme, es funktioniert nicht auf allen; zum Beispiel, dies   Die Funktionalität ist in HP-UX aber als Umgebungsvariable verfügbar   SHLIB_PATH, und auf AIX ist diese Funktionalität durch die Variable   LIBPATH (mit derselben Syntax, eine durch Doppelpunkte getrennte Liste).

     

LD_LIBRARY_PATH ist praktisch für Entwicklung und Tests, sollte es aber nicht sein   modifiziert durch einen Installationsvorgang für den normalen Gebrauch durch normale Benutzer;   Siehe "Warum LD_LIBRARY_PATH ist schlecht" bei    Ссылка für eine Erklärung warum. Aber   Es ist immer noch nützlich für die Entwicklung oder das Testen und für die Arbeit   Probleme, die sonst nicht bearbeitet werden können. Wenn du nicht willst   Setzen Sie die Umgebungsvariable LD_LIBRARY_PATH, unter Linux können Sie sogar   Rufen Sie den Programmlader direkt auf und übergeben Sie ihm Argumente. Beispielsweise,   Im Folgenden wird der angegebene PATH anstelle des Inhalts von   Umgebungsvariable LD_LIBRARY_PATH, und führen Sie die angegebene ausführbare Datei:

     

/lib/ld-linux.so.2 --library-path PATH EXECUTABLE

     

Wenn Sie ld-linux.so ohne Argumente ausführen, erhalten Sie mehr Hilfe   Verwenden Sie dies, aber wieder, verwenden Sie dies nicht für den normalen Gebrauch - das sind   alles zum Debuggen gedacht.

wurde am 13. August 2013 von: Ссылка

genommen

Der Link im Dokument ist alt, hier finden Sie den gewünschten Artikel: Ссылка

bearbeiten

Sie können eine Bibliothek, mit der ein Programm während der Erstellung / Installation verknüpft ist, überschreiben, da ld.so eine Bibliothek sucht, die zur Laufzeit geladen werden soll. Eine Bibliothek, die an einer Position innerhalb der Umgebungsvariablen LD_LIBRARY_PATH gefunden wurde, wird anstelle einer Bibliothek geladen, die den Standardpfad ( /lib und /usr/lib )

enthält

von man 8 ld.so

%Vor%     
hetepeperfan 13.08.2013 11:26
quelle

Tags und Links