korrekte Verwendung von rpath (relative vs. absolute)
Beim Bau einer Binär-oder Bibliothek, unter Angabe der rpath
, d.h.
-Wl,rpath,<path/to/lib>
sagt dem linker, wo Sie die benötigte Bibliothek zur Laufzeit der binären.
Was ist die UNIX-Philosophie in Bezug auf absolute und relative Pfade hier? Ist es besser, verwenden Sie einen absoluten Pfad, also die lib gefunden werden kann, von überall? Oder ist es besser zu machen es relativ so kopieren Sie ein ganzes Verzeichnis oder umbenennen einer höheren Ebene Pfad nicht darstellen der binären unbrauchbar?
Update
Mit $ORIGIN
ist in der Regel die bevorzugte Methode zum erstellen von Binärdateien. Für Bibliotheken, die ich gerne in den absoluten Pfad, weil sonst Sie nicht in der Lage sein, um einen link zur Bibliothek. Einen symbolischen link ändern wird die $ORIGIN
auf den Pfad der link und nicht der link Ziel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit relativem Pfad macht eine ausführbare Datei, die nur funktioniert, wenn Sie aufgerufen wird, von einem bestimmten Verzeichnis, die fast nie, was Sie wollen. E. g. wenn die ausführbare Datei ist in
/app/foo/bin/exe
und hatDT_RUNPATH
vonlib/
, und eine abhängige Bibliothek ist in/app/foo/lib/libfoo.so
, dann dieexe
würde nur laufen, wenn Sie aufgerufen wird, von/app/foo
, und nicht beim Aufruf aus einem anderen Verzeichnis.Absolute Pfad ist viel besser: man kann
cd /tmp; /app/foo/bin/exe
und die ausführbare Datei noch in Arbeit. Dies ist jedoch immer noch weniger als ideal: Sie können nicht einfach mehrere Versionen der binären (wichtig während der Entwicklung), und Sie diktieren zu Ende-Benutzern, wo müssen Sie das Paket installieren.Auf Systemen, die Unterstützung
$ORIGIN
mitDT_RUNPATH
von$ORIGIN/../lib
Ihnen würde eine ausführbare Datei, was auch funktioniert, wenn überall installiert und aufgerufen, aus einem beliebigen Verzeichnis, so lange als relative Pfade zubin/
undlib/
erhalten.Im Fall von
rpath
es keinen Sinn macht, einen relativen Pfad verwenden, da ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis, NICHT relativ zu dem Verzeichnis wo die binary/library gefunden wurde. Also es funktioniert einfach nicht für ausführbare Dateien gefunden in$PATH
oder Bibliotheken, die in so ziemlich jedem Fall.Verwenden Sie stattdessen die
$ORIGIN
"Besondere" Weg, um einen relativen Pfad zu der ausführbaren Datei mit-Wl,-rpath,'$ORIGIN'
-- beachten Sie, dass Sie Anführungszeichen um es zu vermeiden, dass die shell interpretiert es als variable, und wenn Sie versuchen, tun dies in einer Datei Makefile, müssen Sie$$
zu vermeiden, stellen Sie interpretieren die$
als gut.-rpath='$ORIGIN'
? (Gleichheitszeichen statt Komma)-rpath
und der eigentliche Pfad-argument), also das Komma zwischen Ihnen. GNU-ld wird es akzeptieren entweder zwei Argumente, oder ein einzelnes argument mit einem=
wie Sie vorschlagen, also entweder arbeiten können. Andere linkers (Solaris in den Sinn kommt) nur akzeptieren, es als zwei Argumente.