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_PRELOADden 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 lsmit 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_PATHist besser für diesen Zweck.
Mit LD_PRELOAD Sie Bibliotheken Vorrang geben.
Zum Beispiel können Sie eine Bibliothek schreiben, die mallocund implementiert free. Und indem Sie diese mit LD_PRELOADIhrem laden mallocund freewerden statt der Standard ausgeführt.
calloc? würde das nicht alles durcheinander bringen?
mallocund free speziell in glibc entwickelt wurden, um dies zu ermöglichen, und der Bestand callocschafft 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_PRELOADBibliothek vorgeladen. Übrigens können Sie PRÜFEN, ob die Einstellung auf lddBefehl 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_PRELOADlistet 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.sonach 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_PRELOADPfads 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.