Je suis tombé récemment sur une référence à ce sujet sur proggit et (pour l'instant), il n'est pas expliqué.
Je soupçonne que ce pourrait être ça, mais je ne sais pas avec certitude.
Je suis tombé récemment sur une référence à ce sujet sur proggit et (pour l'instant), il n'est pas expliqué.
Je soupçonne que ce pourrait être ça, mais je ne sais pas avec certitude.
Réponses:
Si vous définissez LD_PRELOADle chemin d'un objet partagé, ce fichier sera chargé avant toute autre bibliothèque (y compris le runtime C, libc.so). Donc, pour exécuter lsvotre malloc()implémentation spéciale , procédez comme suit:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD. La raison en est qu'il s'agit d'une variable d'environnement, elle est héritée par les processus enfants - qui peuvent avoir un répertoire de travail différent de celui du processus parent. Ainsi, tout chemin relatif ne parviendrait pas à localiser la bibliothèque à précharger.
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_PATHc'est mieux à cette fin.
Avec, LD_PRELOADvous pouvez donner la priorité aux bibliothèques.
Par exemple, vous pouvez écrire une bibliothèque qui implémente mallocet free. Et en les chargeant avec LD_PRELOADvotre mallocet freesera exécuté plutôt que les standards.
calloc? cela ne gâcherait-il pas tout?
mallocet gratuit sont spécifiquement conçus en glibc pour permettre cela et le stock callocparvient à appeler votre importé malloc. N'essayez pas cela avec d'autres fonctions. Ça ne marchera pas si bien.
Comme beaucoup de gens l'ont mentionné, utiliser LD_PRELOADpour précharger la bibliothèque. BTW, vous pouvez VÉRIFIER si le paramètre est disponible par lddcommande.
Exemple: supposons que vous deviez précharger le vôtre 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_PRELOADrépertorie les bibliothèques partagées avec des fonctions qui remplacent l'ensemble standard, tout comme le /etc/ld.so.preloadfait. Ceux-ci sont mis en œuvre par le chargeur /lib/ld-linux.so. Si vous souhaitez remplacer uniquement quelques fonctions sélectionnées, vous pouvez le faire en créant un fichier objet et un paramètre de substitution LD_PRELOAD; les fonctions de ce fichier objet remplaceront uniquement ces fonctions en laissant les autres telles qu'elles étaient.
Pour plus d'informations sur les bibliothèques partagées, visitez http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Voici un article de blog détaillé sur le préchargement:
il est facile d'exporter mylib.sovers env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
pour désactiver:
$ export LD_PRELOAD=
unset LD_PRELOAD
lorsque LD_PRELOAD est utilisé, ce fichier sera chargé avant toute autre
$export LD_PRELOAD=/path/libbibliothèque à précharger, même cela peut également être utilisé dans les programmes
À l'aide de LD_PRELOADpath, vous pouvez forcer le chargeur d'application à charger l'objet partagé fourni, par rapport à celui 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.