Verknüpfte Bibliothek für eine bestimmte ausführbare Datei ändern (CentOs 6)


29

Ich habe eine ausführbare Datei wie folgt verlinkt:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Wo sich die Bibliotheken libcrypto und libssl befinden, ist openssl 1.0.0-fips libs. Ich möchte stattdessen mit den 1.0.1-Bibliotheken experimentieren und habe sie daher in meinem Ausgangsverzeichnis erstellt. Gibt es eine Möglichkeit, a.outohne großen Aufwand einen Relink zu meinen neuen OpenSL-Bibliotheken herzustellen? Ich würde gerne vermeiden

  • Erneut verknüpfen müssen a.out(weil die Build-Tools sehr kompliziert sind)
  • Ändern globaler Einstellungen (da andere Entwickler auf diesem Computer arbeiten)

Kann man hier machen, was ich mir erhoffe?

Antworten:


22

Sie können diese bestimmte Ausführung vorübergehend durch eine andere Bibliothek ersetzen. Unter Linux ist die Umgebungsvariable LD_LIBRARY_PATH eine durch Doppelpunkte getrennte Gruppe von Verzeichnissen, in denen zuerst nach Bibliotheken gesucht werden soll, bevor die Standardgruppe von Verzeichnissen verwendet wird. Dies ist nützlich, wenn Sie eine neue Bibliothek debuggen oder eine nicht standardmäßige Bibliothek für spezielle Zwecke verwenden. Die Umgebungsvariable LD_PRELOAD listet gemeinsam genutzte Bibliotheken mit Funktionen auf, die den Standardsatz überschreiben, genau wie /etc/ld.so.preload. - Gemeinsame Bibliotheken

Sie können den Loader auch direkt aufrufen:

/lib/ld-linux.so.2 --library-path path executable


1
LD_LIBRARY_PATH überschreibt den Standardsuchpfad nicht. Ich habe es eingestellt, aber ldd zeigt mir immer noch den Standardpfad des Systems, nicht den überschriebenen. Obwohl ich das Laden meiner eigenen Bibliothek erzwingen kann, indem ich LD_PRELOAD setze.
Calmarius

18

Schreiben Sie ein Wrapper-Skript, das die LD_LIBRARY_PATHUmgebungsvariable festlegt . Dies ist das Pendant PATHfür gemeinsam genutzte Bibliotheken. Der Systemsuchpfad wird immer nach den in aufgelisteten Verzeichnissen durchsucht $LD_LIBRARY_PATH. Weitere Informationen finden Sie im Dynamic Linker-Handbuch .

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

Oder einmalig direkt in der Befehlszeile:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

Wenn Sie die Binärdatei ändern möchten , können Sie auch chrpath verwenden , um den in der ausführbaren Datei gespeicherten Bibliothekssuchpfad zu bearbeiten.


2
+1 für chrpath. Genau das, was ich brauchte.
Raghav RV

Niedliche Geschichte, Microsoft ist zu dumm, um 2 Minuten damit zu verbringen, dies zu googeln, und rät jedem, LD_LIBRARY_PATH zu verwenden, anstatt SQL Server explizit mit openssl.so zu verknüpfen oder erneut mit der Version von openssl.so blogs.msdn.microsoft.com/sql_server_team zu kompilieren /…
Evan Carroll
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.