Wenn Sie eine Binärdatei versenden, ist es gut, den Benutzern Mittel zur Verfügung zu stellen, um die Binärdatei an die Besonderheiten ihres eigenen Systems anzupassen, unter anderem durch Anpassen der Suchpfade der Bibliothek.
Ein Benutzer kann im Allgemeinen LD_LIBRARY_PATH
anpassen und /etc/ld.so.conf
, die beide eine niedrigere Priorität als DT_RPATH
haben , d.h. Sie können nicht überschreiben, was in der Binärdatei fest codiert ist, während Sie DT_RUNPATH
verwenden stattdessen kann ein Benutzer es mit LD_LIBRARY_PATH
überschreiben .
(FWIW, ich denke ld.so.conf
sollte auch Vorrang vor DT_RUNPATH
haben , aber immerhin haben wir LD_LIBRARY_PATH
).
Außerdem bin ich mit dem obigen Vorschlag, DT_RPATH
zu verwenden, absolut nicht einverstanden . IMO, es ist am besten, Nether DT_RPATH
zu verwenden nicht DT_RUNPATH
in ausgelieferten Binärdateien.
es sei denn
Sie alle Ihre abhängigen Bibliotheken mit Ihren ausführbaren Dateien ausliefern und sicherstellen möchten, dass JustWork(tm) nach der Installation funktioniert, verwenden Sie in diesem Fall DT_RPATH
.
Aber warum wurde dann RPATH zugunsten von RUNPATH verworfen?
Als DT_RPATH eingeführt wurde, hatte es Vorrang vor allen anderen Parametern. Dies machte es unmöglich, den Suchpfad der Bibliotheken zu überschreiben, selbst für Entwicklungszwecke. Daher wurde ein weiterer Parameter, LD_RUNPATH, eingeführt, der einen niedrigeren Vorrang als LD_LIBRARY_PATH hat.
Weitere Details finden Sie in der Arbeit "Wie man gemeinsam genutzte Bibliotheken schreibt" von Ulrich Drepper .
Chills Antwort ist genau richtig; Ich wollte einfach etwas Farbe hinzufügen, aus einer kürzlichen Lektüre der glibc-Quelle ([master 8b0ccb2], in 2.17). Um es klar zu sagen, wenn eine Bibliothek nicht an dem Ort gefunden wird, der durch eine gegebene Ebene angegeben ist, wird die nächste Ebene versucht. Wenn eine Bibliothek auf einer bestimmten Ebene gefunden wird, stoppt die Suche.
Reihenfolge der dynamischen Bibliothekssuche:
- DT_RPATH in der ELF-Binärdatei, es sei denn, DT_RUNPATH ist gesetzt.
- LD_LIBRARY_PATH-Einträge, außer setuid/setgid
- DT_RUNPATH in ELF-Binärdatei
- /etc/ld.so.cache-Einträge, es sei denn, -z nodeflib wird zur Verbindungszeit angegeben
- /lib, /usr/lib, außer -z nodeflib
- Fertig, "nicht gefunden".