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.
c
linux
environment-variables
Hank Gay
la source
la source
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écuterls
votremalloc()
implémentation spéciale , procédez comme suit:la source
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.la source
Avec,
LD_PRELOAD
vous pouvez donner la priorité aux bibliothèques.Par exemple, vous pouvez écrire une bibliothèque qui implémente
malloc
etfree
. Et en les chargeant avecLD_PRELOAD
votremalloc
etfree
sera exécuté plutôt que les standards.la source
calloc
? cela ne gâcherait-il pas tout?malloc
et gratuit sont spécifiquement conçus en glibc pour permettre cela et le stockcalloc
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 parldd
commande.Exemple: supposons que vous deviez précharger le vôtre
libselinux.so.1
.Ainsi, définissez votre environnement de préchargement:
Vérifiez à nouveau votre bibliothèque:
la source
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 substitutionLD_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
la source
Voici un article de blog détaillé sur le préchargement:
https://blog.cryptomilk.org/2014/07/21/what-is-preloading/
la source
il est facile d'exporter
mylib.so
vers env:pour désactiver:
la source
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 programmesla source
À 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.
la source