c et LD_PRELOAD. appels ouverts et open64 interceptés, mais pas stat64

J’ai créé une petite bibliothèque partagée qui tente d’intercepter les appels sys ouverts, open64, stat et stat64. Lorsque j’exporte LD_PRELOAD et que j’exécute sqlplus d’Oracle, je peux voir les traces des appels open et open64, mais aucune trace des appels stat et stat64. La bibliothèque partagée est un fichier c unique contenant toutes les définitions des appels sys. Pourquoi arrive-t-il que certains appels système soient interceptés et d’autres pas? Merci de votre aide.

Parce que GNU libc implémente open() et open64() comme vous le souhaiteriez (c’est-à-dire qu’ils ne sont que des symboles liés de manière dynamic auxquels vous pouvez vous connecter avec LD_PRELOAD ), mais fait quelque chose de spécial avec stat() et stat64() .

Si vous regardez les symboles exportés par la libc (par exemple avec nm -D /libc/libc.so.6 ), vous verrez qu’elle ne fournit pas les symboles stat ou stat64 !

Les appels à ces fonctions sont encapsulés – soit au moment de la compilation (si possible) par des fonctions inline dans , ou (à défaut, par des définitions liées statiquement fournies par libc_nonshared.a .

Les fonctions actuellement liées dynamicment qui sont appelées sont __xstat() ou __xstat64() ; et ceux-ci prennent un premier argument supplémentaire, un entier, qui est un numéro de version indiquant la disposition de struct stat attendue par l’appelant. Essayez de les accrocher à la place.

(Le but de tout cela est de permettre à la bibliothèque liée dynamicment de prendre en charge les binarys qui utilisent différentes dispositions incompatibles de struct stat et de définitions de bits dans mode_t ; si vous regardez dans /usr/include/sys/stat.h vous trouverez une commentaire à cet effet. fstat() , fstat64() , lstat() , lstat64() et mknod() sont également affectés de la même manière.)