Ich habe kürzlich auf proggit einen Hinweis darauf gefunden und (ab sofort) wird es nicht erklärt.
Ich vermute das könnte es sein, aber ich weiß es nicht genau.
Wenn Sie LD_PRELOAD
auf den Pfad eines gemeinsam genutzten Objekts setzen, wird diese Datei vor einer anderen Bibliothek (einschließlich der C-Laufzeitumgebung, libc.so
) geladen. So führen Sie ls
mit Ihrer speziellen malloc()
-Implementierung aus:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
Sie können Symbole in den Materialbibliotheken überschreiben, indem Sie eine Bibliothek mit denselben Symbolen erstellen und die Bibliothek in LD_PRELOAD
angeben.
Einige Leute verwenden es, um Bibliotheken an anderen Orten als dem Standard anzugeben, aber LD_LIBRARY_PATH
ist für diesen Zweck besser geeignet.
Mit LD_PRELOAD
können Sie Bibliotheken Vorrang einräumen.
Beispielsweise können Sie eine Bibliothek schreiben, die malloc
und free
implementiert. Wenn Sie diese mit LD_PRELOAD
laden, werden Ihre malloc
und free
anstelle der Standardvariablen ausgeführt.
Wie bereits erwähnt, verwenden Sie LD_PRELOAD
, um die Bibliothek vorab zu laden. Übrigens, Sie könnenPRÜFEN, OBmit dem Befehl ldd
verfügbar ist.
Beispiel: Nehmen Sie an, Sie müssen Ihren eigenen libselinux.so.1
vorladen.
> 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)
So legen Sie Ihre Preload-Umgebung fest:
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, genau wie /etc/ld.so.preload
. Diese werden vom Loader /lib/ld-linux.so
implementiert. Wenn Sie nur einige ausgewählte Funktionen überschreiben möchten, können Sie dies tun, indem Sie eine überschreibende Objektdatei erstellen und 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
es ist einfach mylib.so
in env zu exportieren:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
etwas deaktivieren :
$ export LD_PRELOAD=
Hier ist ein ausführlicher Blogbeitrag zum Vorladen:
Mit LD_PRELOAD
path können Sie das Laden des bereitgestellten gemeinsam genutzten Objekts durch den Anwendungslader über den angegebenen Standard erzwingen.
Entwickler verwenden dies zum Debuggen ihrer Anwendungen, indem verschiedene Versionen der gemeinsam genutzten Objekte bereitgestellt werden.
Wir haben es verwendet, um bestimmte Anwendungen zu hacken, indem vorhandene Funktionen mithilfe vorbereiteter gemeinsam genutzter Objekte überschrieben werden.
wenn LD_PRELOAD verwendet wird, wird diese Datei geladen, bevor eine andere $export LD_PRELOAD=/path/lib
lib vorgeladen wird. Dies kann auch in Programmen verwendet werden