web-dev-qa-db-de.com

Was ist der LD_PRELOAD-Trick?

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.

293
Hank Gay

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
350
JesperE

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.

40
Joshua

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.

31
Ronny Brendel

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)
    ...
22
Patric

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

9
Rajesh

es ist einfach mylib.so in env zu exportieren:

$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

etwas deaktivieren :

$ export LD_PRELOAD=
3
JulienGenoud

Hier ist ein ausführlicher Blogbeitrag zum Vorladen:

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/

2
asn

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.

1

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

0