Dies ist kein Duplikat, da es sich hier um eine Besonderheit handelt, die mir bei der Verwendung aufgefallen ist /etc/ld.so.conf
.
Um die Pfade zu erhalten, in denen der dynamische Linker nach Bibliotheken sucht, führe ich den Befehl aus ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"
. Wenn /etc/ld.so.conf
darin keine Pfade aufgelistet sind. Die Ausgabe des vorherigen Befehls lautet
/lib
/usr/lib
Ich dachte, dass /lib
zuerst gesucht wird und dann /usr/lib
. Wenn ich einen neuen Pfad hinzufüge, z. B. /usr/local/lib
, zu /etc/ld.so.conf
und dann neu erstellen , wird /etc/ld.so.cache
die Ausgabe vonldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"
/usr/local/lib
/lib
/usr/lib
Ich finde das merkwürdig, denn wenn ich damit richtig liege, dass die aufgelisteten Verzeichnisse in der Reihenfolge von oben nach unten durchsucht werden, dann werden zusätzliche Verzeichnisse vor /lib
und durchsucht /usr/lib
. Dass die zusätzlichen Verzeichnisse vor den vertrauenswürdigen Verzeichnissen durchsucht werden, ist an sich nicht merkwürdig, aber wenn /lib
vor durchsucht wird /usr/lib
, ist das merkwürdig, weil /bin
& nach & in /sbin
durchsucht werden ./usr/bin
/usr/sbin
PATH
Selbst wenn die von aufgelisteten Pfade ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"
von unten nach oben durchsucht würden, wäre die Reihenfolge dennoch schief, weil nach den vertrauenswürdigen Verzeichnissen nach weiteren Verzeichnissen gesucht würde, während /lib
nach durchsucht würde /usr/lib
.
In welcher Reihenfolge werden also die ld.so
Pfade nach Bibliotheken durchsucht? Warum wird /lib
vor durchsucht /usr/lib
? Wenn nicht, warum werden dann nach durchsucht /lib
?
Antwort1
Die Reihenfolge ist im Handbuch des dynamischen Linkers dokumentiert.ld.so
. Es ist:
- Verzeichnisse von
LD_LIBRARY_PATH
; - Verzeichnisse von
/etc/ld.so.conf
; /lib
;/usr/lib
.
(Ich vereinfache es ein wenig, alle Einzelheiten finden Sie im Handbuch.)
Die Reihenfolge ist sinnvoll, wenn man bedenkt, dass dies die einzige Möglichkeit ist, eine Bibliothek an einem Standardspeicherort durch eine benutzerdefinierte Bibliothek zu überschreiben. LD_LIBRARY_PATH
ist eine Benutzereinstellung, muss sie vor den anderen stehen. /etc/ld.so.conf
ist eine lokale Einstellung, steht sie vor der Betriebssystem-Standardeinstellung. Wenn ich als Benutzer also ein Programm mit einer anderen Version einer Bibliothek ausführen möchte, kann ich das Programm mit dem Speicherort dieser anderen Bibliotheksversion ausführen . Und als Administrator kann ich eine andere Version der Bibliothek in und eine Liste LD_LIBRARY_PATH
einfügen ./usr/local/lib
/usr/local/lib
/etc/ld.so.conf
Vertrauen spielt hierbei keine Rolle. Jedes in diesem Suchpfad aufgeführte Verzeichnis muss vertrauenswürdig sein, da jede Bibliothek von dort geladen werden könnte. Theoretisch könnten Sie die Bibliotheksnamen auflisten, die von allen Programmen auf Ihrem System verwendet werden, „die mehr Vertrauen erfordern“, und sicherstellen, dass alle diese Bibliotheken in den „vertrauenswürdigsten“ Verzeichnissen vorhanden sind. Dann würden die „weniger vertrauenswürdigen“ Verzeichnisse nicht verwendet, wenn sie im Suchpfad nach den vertrauenswürdigeren Verzeichnissen kämen, mit Ausnahme der Programme, „die weniger Vertrauen erfordern“. Aber das wäre äußerst fragil. Es wäre auch ziemlich sinnlos: Wenn ein Angreifer einen Wert von LD_LIBRARY_PATH
oder ein Element von einfügen kann /etc/ld.so.conf
, hat er sicherlich einen direkteren Weg, beliebigen Code auszuführen, wie etwa das Einfügen eines Werts von PATH
, von LD_PRELOAD
usw. Vertrauen in den Ladepfad der Bibliothek ist wichtig, wenn die Ausführung eine Vertrauensgrenze überschreitet, d. h. wenn ein Programm mit zusätzlichen Berechtigungen ausgeführt wird (z. B. ein Setuid-/Setgid-Programm oder über sudo
). In diesem Fall wird LD_LIBRARY_PATH
ausgeblendet.
Was /lib
vs betrifft /usr/lib
, spielt es keine große Rolle: Sie werden von derselben Entität (dem Betriebssystem) bereitgestellt und es sollte keine Bibliothek geben, die in beiden vorhanden ist. Es ist sinnvoll, /lib
zuerst aufzulisten, da dies einen (sehr kleinen) Leistungsvorteil bietet: Die am häufigsten verwendeten Bibliotheken, insbesondere die von kleinen Basisprogrammen verwendeten Bibliotheken (bei denen die Ladezeit einen größeren Anteil der Gesamtlaufzeit ausmacht als bei großen, lang laufenden Programmen), befinden sich in /lib
.