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.