Comment puis-je ré-écrire (ou enveloppe) un syscall fonction sur Linux?
Supposons que je veuille prendre complètement le open() de l'appel système, peut-être pour envelopper le réel syscall et d'effectuer une journalisation. Une façon de le faire est d'utiliser LD_PRELOAD pour charger un (utilisateurs) de l'objet partagé bibliothèque qui prend le relais de l'ouvrir() point d'entrée.
Les utilisateurs de open() de la routine obtient alors le pointeur de la glibc fonction open()
par dlsym()
ing, et en l'appelant.
La solution proposée ci-dessus est une solution dynamique, cependant. Supposons que je veux un lien sur mon propre open()
wrapper de manière statique. Comment aurais-je le faire? Je suppose que le mécanisme est le même, mais je pense que il y aura un symbole de l'affrontement entre l'utilisateur défini par l' open()
et de la libc open()
.
Nous faire part d'autres techniques pour atteindre le même objectif.
- Que diriez-vous juste coller une fonction wrapper/macro dans votre code?
- Je préfère ne pas utiliser des macros. Je n'ai pas vraiment un problème. Je demande juste à accroître les connaissances et d'en apprendre de nouveau truc.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser l'écharpe de fonctionnalité
ld
. Deman ld
:Donc vous avez juste à utiliser le préfixe
__wrap_
pour votre fonction wrapper et__real_
lorsque vous voulez appeler la fonction réelle. Un exemple simple est:malloc_wrapper.c
:Application de Test
testapp.c
:Puis compilez l'application:
La sortie de l'application résultante sera:
-ltools
,-Wl,-wrap,malloc
ne fonctionnera pas.extern "C"
lors de l'utilisation de ce code dans un programme C++.__wrap_malloc
? Ou peut-il être nommé différemment? Ce que je veux dire, c'est lors de l'emballage des appels système, ne nous ont pour nom les fonctions mêmes que celles de l'appel?man ld
montre, les symboles doivent avoir les préfixes__wrap_
et__real_
.Symboles sont résolus par l'éditeur de liens dans l'ordre de la liste sur la ligne de commande, donc si vous avez inscrit votre bibliothèque avant que la bibliothèque standard, vous avez de l'precidence. Pour gcc, vous aurez besoin de spécifier
De cette façon, vos bibliothèques d'être recherché et trouvé le premier.