2013-07-29 2 views
6

Ich bin mir der allgemeinen Grundlagen der Verwendung von ldconfig und LD_LIBRARY_PATH bewusst, aber ich hoffe auf ein wenig Guru Hilfe bei meiner Situation.Korrekte Verwendung von LD_LIBRARY_PATH oder ldconfig für ein Softwarepaket

Ich habe ein tragbares Softwarepaket, das sich in einem eigenen Verzeichnis befindet und eigene Versionen vieler Bibliotheken hat.

Es gibt viele Binärdateien und Skripte, die von diesem Verzeichnis ausgeführt werden.

Einige der Binärdateien (Apache, PHP, Postgres) können auch separate Versionen auf dem System installiert haben.

Da es zwei Versionen von PHP gibt, ist es nicht ausreichend, /etc/ld.so.conf.d/myapp.conf zu erstellen, wenn das System nicht bestimmen kann, für welche Version von "myapp" die Datei ldconfig verwendet werden soll.

Ich bin auf der Suche nach Best Practices bei der Konfiguration eines solchen Systems. Die Person, die das Softwarepaket ursprünglich eingerichtet hat, exportierte LD_LIBRARY_PATH, damit ALLE Anwendungen auf dem System es verwendeten.

Ich versuche, nur die Anwendungen im Paketverzeichnis zu isolieren.

Einige Parameter, mit arbeiten:

/mypack - alles für das Softwarepaket enthält

/mypack/local/lib - enthalten erforderliche Bibliotheken, die nicht mit dem System

Bibliothek Beispiel kompatibel sein können:

/mypack/local/lib/libz.so.1 => /mypack/local/lib/libz.so.1.2.3 
/lib/libz.so.1 => /lib/libz.so.1.2.3 

obwohl die Versionen die gleichen sind, kann die in/mypack nicht mit der Distribution kompatibel sein und das System brechen, wenn es

binäres Beispiel verwendet wird: php sowohl/mypack und im Standardverzeichnis php von/mypack sollte Libs verwenden von/mypack/local/lib und die existiert Version sollte verwenden/lib

Einige Fragen über Linux-Bibliothekspfade: - Ist es möglich, /etc/ld.so.conf.d/php.conf so zu spezifizieren, dass es nur die Version von PHP in/mypack betrifft ? - Kann der Bibliothekspfad basierend auf dem Speicherort einer ausführbaren Datei angegeben werden? Das heißt, kann der Pfad einer ausführbaren Datei zur Laufzeit unter/mypack automatisch Bibliotheken von dort verwenden? - Wie wäre es auf einer Pro-Benutzer-Basis? Einige/das meiste System wird auf verschiedenen Benutzerkonten ausgeführt. Wenn ich in der Lage wäre, einen anderen Bibliothekspfad pro Benutzer festzulegen, würde das den Fehler beheben.

+0

Ich denke, die typische Vorgehensweise ist ein Wrapper-Skript verwenden. Das Wrapper-Skript legt den Wert von LD_LIBRARY_PATH fest und führt dann die ausführbare Datei aus. Schauen Sie sich zum Beispiel google-chrome an. –

+0

Wenn das die einzige Möglichkeit ist, auf die irgendjemand kommt, werde ich damit gehen. Ich habe bereits Chrome 28 in CentOS ausgeführt, aber aufgrund der Anzahl der verschiedenen ausführbaren Dateien versuchte ich es zu vermeiden. – thatthatisis

Antwort

5

Falls jemand dieses nützlich findet, landete ich vor Gebäude tun dies bis:

export LD_RUN_PATH='$ORIGIN/../lib' 

Dazu gehört auch eine Bibliothek Pfad im binären selbst relativ zur Position des binären. Wenn Sie dies in einem Bash-Skript oder in Ihren Build-Dateien verwenden möchten, stellen Sie sicher, dass Sie Ihre spezielle Verwendung mit $ ORIGIN nachschlagen, da es Fälle gibt, in denen Sie etwas wie \ $ ORIGIN, \ $$ ORIGIN oder $$ tun müssen URSPRUNG, damit verschiedene am Build beteiligte Dienstprogramme das Dollarzeichen richtig erhalten. Durch die Suche nach diesem nützlichen Bit konnte ich nicht mehr als 50 einzelne Skripts aktualisieren, die als Batch ausgeführt werden, um unser Softwarepaket zu erstellen.

0

Das Problem im Allgemeinen ist, dass LD_LIBRARY_PATH den Informationen vorausgeht, die von ldconfig bereitgestellt werden. Wenn alles, was Sie tun wollen für die Installation auf Systemen eine Reihe von Backup-Bibliotheken, die bereits nicht in Anspruch genommen haben, extrahieren Sie den aktuellen Satz von Bibliotheken von ldconfig und voranstellen, sie LD_LIBRARY_PATH

mytmp=/tmp/${USER}_junk$$ 
(for i in `/sbin/ldconfig -p | grep '=>' | awk '{ print $NF }'` ; do dirname $i ; done) | sort -r | uniq > ${mytmp} 
myld="" 
for j in `cat ${mytmp}` ; do myld=${j}:${myld} ; done 
rm -f ${mytmp} 
LD_LIBRARY_PATH=${myld}${LD_LIBRARY_PATH}:${SEP}/lib:${SEP}/lib/syslibs 
export LD_LIBRARY_PATH