GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden Sie RPATH, aber nicht RUNPATH?

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:

  1. DT_RPATH in der ELF-Binärdatei, es sei denn, DT_RUNPATH ist gesetzt.
  2. LD_LIBRARY_PATH-Einträge, außer setuid/setgid
  3. DT_RUNPATH in ELF-Binärdatei
  4. /etc/ld.so.cache-Einträge, es sei denn, -z nodeflib wird zur Verbindungszeit angegeben
  5. /lib, /usr/lib, außer -z nodeflib
  6. Fertig, "nicht gefunden".

Linux
  1. Skript mit rc.local ausführen:Skript funktioniert, aber nicht beim Booten

  2. Tomcat läuft, aber Port 8080 antwortet nicht

  3. php.ini ändert sich, ist aber in Ubuntu nicht wirksam

  4. Gemeinsam genutzten Posix-Speicher entfernen, wenn er nicht verwendet wird?

  5. Kann ich 'rpath' in einer bereits kompilierten Binärdatei ändern?

Warum nicht „welche“ verwenden? Was dann verwenden?

Linux – Warum verwenden wir Su – und nicht nur Su?

Vergleichen Sie Verzeichnisse, aber nicht den Inhalt von Dateien?

Befehl nicht in Zsh, aber in Bash gefunden?

Debian 11.3 ist so gut, dass es einfach keinen Grund gibt, es nicht zu verwenden

Linux wie kopieren, aber nicht überschreiben?