Ich bin kürzlich auf proggit auf einen Hinweis darauf gestoßen, der (ab sofort) nicht erklärt wird.
Ich vermute, das könnte es sein, aber ich weiß es nicht genau.
c
linux
environment-variables
Hank Gay
quelle
quelle
Antworten:
Wenn Sie
LD_PRELOAD
den Pfad eines freigegebenen Objekts festlegen , wird diese Datei vor jeder anderen Bibliothek (einschließlich der C-Laufzeitlibc.so
) geladen . Gehen Sie folgendermaßen vor, umls
mit Ihrer speziellenmalloc()
Implementierung zu arbeiten:quelle
LD_PRELOAD
. Der Grund dafür ist, dass es sich um eine Umgebungsvariable handelt, die von untergeordneten Prozessen geerbt wird, die möglicherweise ein anderes Arbeitsverzeichnis als der übergeordnete Prozess haben. Daher würde ein relativer Pfad die Bibliothek zum Vorladen nicht finden.Sie können Symbole in den Bestandsbibliotheken überschreiben, indem Sie eine Bibliothek mit denselben Symbolen erstellen und die Bibliothek in angeben
LD_PRELOAD
.Einige Leute verwenden es, um Bibliotheken an nicht standardmäßigen Orten anzugeben, aber es
LD_LIBRARY_PATH
ist besser für diesen Zweck.quelle
Mit
LD_PRELOAD
Sie Bibliotheken Vorrang geben.Zum Beispiel können Sie eine Bibliothek schreiben, die
malloc
und implementiertfree
. Und indem Sie diese mitLD_PRELOAD
Ihrem ladenmalloc
undfree
werden statt der Standard ausgeführt.quelle
calloc
? würde das nicht alles durcheinander bringen?malloc
und free speziell in glibc entwickelt wurden, um dies zu ermöglichen, und der Bestandcalloc
schafft es, Ihre importierten aufzurufenmalloc
. Versuchen Sie dies nicht mit anderen Funktionen. Es wird nicht so gut funktionieren.Wie viele Leute bereits erwähnt haben, wird die
LD_PRELOAD
Bibliothek vorgeladen. Übrigens können Sie PRÜFEN, ob die Einstellung aufldd
Befehl verfügbar ist .Beispiel: Angenommen, Sie müssen Ihre eigenen vorladen
libselinux.so.1
.Stellen Sie daher Ihre Preload-Umgebung ein:
Überprüfen Sie Ihre Bibliothek erneut:
quelle
LD_PRELOAD
listet gemeinsam genutzte Bibliotheken mit Funktionen auf, die den Standardsatz überschreiben/etc/ld.so.preload
. Diese werden vom Loader implementiert/lib/ld-linux.so
. Wenn Sie nur einige ausgewählte Funktionen überschreiben möchten, können Sie dies tun, indem Sie eine überschreibende Objektdatei und -einstellung erstellenLD_PRELOAD
. Die Funktionen in dieser Objektdatei überschreiben nur die Funktionen, die andere unverändert lassen.Weitere Informationen zu gemeinsam genutzten Bibliotheken finden Sie unter http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
quelle
Hier ist ein ausführlicher Blog-Beitrag zum Vorladen:
https://blog.cryptomilk.org/2014/07/21/what-is-preloading/
quelle
Es ist einfach,
mylib.so
nach env zu exportieren :Etwas deaktivieren :
quelle
unset LD_PRELOAD
Wenn LD_PRELOAD verwendet wird, wird diese Datei vor jeder anderen Bibliothek geladen
$export LD_PRELOAD=/path/lib
, die vorgeladen werden soll. Dies kann auch in Programmen verwendet werdenquelle
Mithilfe des
LD_PRELOAD
Pfads können Sie den Anwendungslader zwingen, das bereitgestellte freigegebene Objekt über den bereitgestellten Standard zu laden.Entwickler verwenden dies zum Debuggen ihrer Anwendungen, indem sie verschiedene Versionen der freigegebenen Objekte bereitstellen.
Wir haben es verwendet, um bestimmte Anwendungen zu hacken, indem wir vorhandene Funktionen mit vorbereiteten gemeinsam genutzten Objekten überschrieben haben.
quelle