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.
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.
Antworten:
Wenn Sie LD_PRELOAD
den Pfad eines freigegebenen Objekts festlegen , wird diese Datei vor jeder anderen Bibliothek (einschließlich der C-Laufzeit libc.so
) geladen . Gehen Sie folgendermaßen vor, um ls
mit Ihrer speziellen malloc()
Implementierung zu arbeiten:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
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.
Mit LD_PRELOAD
Sie Bibliotheken Vorrang geben.
Zum Beispiel können Sie eine Bibliothek schreiben, die malloc
und implementiert free
. Und indem Sie diese mit LD_PRELOAD
Ihrem laden malloc
und free
werden statt der Standard ausgeführt.
calloc
? würde das nicht alles durcheinander bringen?
malloc
und free speziell in glibc entwickelt wurden, um dies zu ermöglichen, und der Bestand calloc
schafft es, Ihre importierten aufzurufen malloc
. 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 auf ldd
Befehl verfügbar ist .
Beispiel: Angenommen, Sie müssen Ihre eigenen vorladen libselinux.so.1
.
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
Stellen Sie daher Ihre Preload-Umgebung ein:
export LD_PRELOAD=/home/patric/libselinux.so.1
Überprüfen Sie Ihre Bibliothek erneut:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
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 erstellen LD_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
Hier ist ein ausführlicher Blog-Beitrag zum Vorladen:
Es ist einfach, mylib.so
nach env zu exportieren :
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
Etwas deaktivieren :
$ export LD_PRELOAD=
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 werden
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.