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_PRELOAD
le 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 ls
votre 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_PATH
c'est mieux à 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 free
sera exécuté plutôt que les standards.
calloc
? cela ne gâcherait-il pas tout?
malloc
et gratuit sont spécifiquement conçus en glibc pour permettre cela et le stock calloc
parvient à 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_PRELOAD
pour précharger la bibliothèque. BTW, vous pouvez VÉRIFIER si le paramètre est disponible par ldd
commande.
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_PRELOAD
répertorie les bibliothèques partagées avec des fonctions qui remplacent l'ensemble standard, tout comme le /etc/ld.so.preload
fait. 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.so
vers 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/lib
bibliothèque à précharger, même cela peut également être utilisé dans les programmes
À l'aide de LD_PRELOAD
path, 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.