web-dev-qa-db-fra.com

Quel est le truc LD_PRELOAD?

Je suis tombé sur une référence à cela récemment sur proggit et (pour le moment), cela n’est pas expliqué.

Je soupçonne ceci peut-être, mais je ne le sais pas avec certitude.

293
Hank Gay

Si vous définissez LD_PRELOAD sur le chemin d'accès d'un objet partagé, ce fichier sera chargé before toute autre bibliothèque (y compris le runtime C, libc.so). Donc, pour exécuter ls avec votre implémentation malloc() spéciale, procédez comme suit:

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
350
JesperE

Vous pouvez remplacer les symboles dans les bibliothèques de stock en créant une bibliothèque avec les mêmes symboles et en spécifiant la bibliothèque dans LD_PRELOAD.

Certaines personnes l'utilisent pour spécifier des bibliothèques dans des emplacements non standard, mais LD_LIBRARY_PATH est préférable à cette fin .

40
Joshua

Avec LD_PRELOAD, vous pouvez donner la priorité aux bibliothèques.

Par exemple, vous pouvez écrire une bibliothèque qui implémente malloc et free. Et en les chargeant avec LD_PRELOAD, votre malloc et votre free seront exécutés plutôt que ceux standard.

31
Ronny Brendel

Comme beaucoup de personnes l'ont mentionné, utilisez LD_PRELOAD pour précharger la bibliothèque. En passant, vous pouvezVÉRIFIERsi le paramètre est disponible avec la commande ldd

Exemple: supposons que vous deviez précharger votre propre 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)

Ainsi, définissez votre environnement de préchargement:

  export LD_PRELOAD=/home/patric/libselinux.so.1

Vérifiez à nouveau votre bibliothèque:

>ldd /bin/ls
    ...
    libselinux.so.1 =>
    /home/patric/libselinux.so.1 (0x00007fb9245d8000)
    ...
22
Patric

LD_PRELOAD répertorie les bibliothèques partagées avec des fonctions qui remplacent le jeu standard, comme le fait /etc/ld.so.preload. Celles-ci sont implémentées par le chargeur /lib/ld-linux.so. Si vous souhaitez remplacer seulement quelques fonctions sélectionnées, vous pouvez le faire en créant un fichier objet de substitution et en définissant LD_PRELOAD; les fonctions de ce fichier objet remplaceront uniquement celles qui laisseront les autres comme elles étaient.

Pour plus d'informations sur les bibliothèques partagées, visitez http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

9
Rajesh

il est facile d'exporter mylib.so vers env:

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

pour désactiver:

$ export LD_PRELOAD=
3
JulienGenoud

Voici un article de blog détaillé sur le préchargement:

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

2
asn

À l'aide de LD_PRELOAD path, vous pouvez forcer le chargeur d'application à charger l'objet partagé fourni, par-dessus le paramètre fourni par défaut.

Les développeurs l'utilisent pour déboguer leurs applications en fournissant différentes versions des objets partagés.

Nous l'avons utilisé pour pirater certaines applications, en remplaçant les fonctions existantes à l'aide d'objets partagés préparés.

1
dnahc araknayirp

lorsque LD_PRELOAD est utilisé, ce fichier est chargé avant tout autre fichier $export LD_PRELOAD=/path/lib lib, même s'il peut également être utilisé dans des programmes.

0
Sumith Senarathne