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.
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
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 .
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.
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)
...
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
il est facile d'exporter mylib.so
vers env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
pour désactiver:
$ export LD_PRELOAD=
Voici un article de blog détaillé sur le préchargement:
À 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.
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.