Comment réimplémenter (ou encapsuler) une fonction syscall sous Linux?

Supposons que je veuille prendre en charge complètement l’appel système open (), peut-être pour emballer l’appel système réel et effectuer une journalisation. Une façon de faire est d’utiliser LD_PRELOAD pour charger une bibliothèque d’objects partagés ( créée par l’utilisateur) qui prend en charge le point d’entrée open ().

La routine open-made open () obtient alors le pointeur sur la fonction open() glibc par dlsym() et l’appel.

La solution proposée ci-dessus est cependant une solution dynamic. Supposons que je veuille relier statiquement mon propre wrapper open() . Comment pourrais-je le faire? Je suppose que le mécanisme est le même, mais je suppose également qu’il y aura un conflit de symboles entre open() et la libc open() .

Veuillez partager toute autre technique pour atteindre le même objective.

    Vous pouvez utiliser la fonctionnalité wrap fournie par ld . De l’ man ld :

    --wrap symbol Utilisez une fonction wrapper pour le symbole. Toute référence non définie à un symbol sera résolue en __wrap_symbol .

    Toute référence non définie à __real_symbol sera résolue en symbol .

    Il vous suffit donc d’utiliser le préfixe __wrap_ pour votre fonction wrapper et __real_ lorsque vous souhaitez appeler la fonction réelle. Un exemple simple est:

    malloc_wrapper.c :

     #include  void *__real_malloc (size_t); /* This function wraps the real malloc */ void * __wrap_malloc (size_t size) { void *lptr = __real_malloc(size); printf("Malloc: %lu bytes @%p\n", size, lptr); return lptr; } 

    Tester l’application testapp.c :

     #include  #include  int main() { free(malloc(1024)); // malloc will resolve to __wrap_malloc return 0; } 

    Ensuite, comstackz l’application:

     gcc -c malloc_wrapper.c gcc -c testapp.c gcc -Wl,-wrap,malloc testapp.o malloc_wrapper.o -o testapp 

    Le résultat de l’application résultante sera:

     $ ./testapp Malloc: 1024 bytes @0x20d8010 

    Les symboles sont résolus par l’éditeur de liens dans l’ordre dans lequel vous les répertoriez sur la ligne de commande. Par conséquent, si vous avez répertorié votre bibliothèque avant la bibliothèque standard, vous avez des précisions. Pour gcc, vous devez spécifier

     gcc  -nodefaultlibs  -lYOUR_LIB  

    De cette façon, vos bibliothèques seraient recherchées et trouvées en premier.