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?

Fixee
quelle

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

David Schwartz
quelle
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.

Gilles 'SO - hör auf böse zu sein'
quelle
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