Question

J'ai fait une petite bibliothèque partagée qui tente d'intercepter ouvert, open64, stat et stat64 sys appels.Quand je l'export LD_PRELOAD et exécuter oracle sqlplus, je peux voir les traces de l'ouvrir et open64 des appels, mais pas de traces de la stat et stat64 appels.La bibliothèque partagée est un seul fichier c avec toutes les définitions de l'sys appels en elle.Pourquoi se fait-il que certains appels sont interceptés et d'autres pas?merci pour votre aide.

Était-ce utile?

La solution

Parce que la GNU libc met en œuvre open() et open64() comme vous pouvez vous attendre (c'est à direils sont juste liés dynamiquement les symboles que vous pouvez brancher dans avec LD_PRELOAD), mais fait quelque chose de spécial avec stat() et stat64().

Si vous regardez les symboles exportés par libc (par ex.avec nm -D /libc/libc.so.6), vous verrez qu'il ne fait pas de fournir les symboles stat ou stat64!

Les appels à ces fonctions sont enveloppés - soit au moment de la compilation (si possible) par des fonctions inline dans <sys/stat.h>, ou (à défaut) lié statiquement définitions fournies par libc_nonshared.a.

La réelle liée dynamiquement des fonctions qui sont appelés __xstat() ou __xstat64();et ces-être un premier argument un entier, qui est un numéro de version indiquant la mise en page de struct stat qui est attendu par l'appelant.Essayez de brancher ces dernières.

(Le point de tout cela est de permettre à la liée de façon dynamique libc à l'appui de fichiers binaires qui utilisent diverses dispositions incompatibles de struct stat et les définitions de bits dans mode_t;si vous regardez dans /usr/include/sys/stat.h vous trouverez un commentaire à cet effet. fstat(), fstat64(), lstat(), lstat64() et mknod() sont également touchés de la même façon.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top