c和LD_PRELOAD。 拦截open和open64调用,但不是stat64

我做了一个小的共享库,试图拦截open,open64,stat和stat64 sys调用。 当我导出LD_PRELOAD并运行oracle的sqlplus时,我可以看到open和open64调用的痕迹,但没有stat和stat64调用的痕迹。 共享库是一个单独的c文件,其中包含sys调用的所有定义。 为什么有些系统调用被截获而其他系统没有被截获? 谢谢你的帮助。

因为GNU libc实现了你想要的open()open64() (即它们只是你可以用LD_PRELOAD挂钩的动态链接符号),但是对stat()stat64()做了一些特别的事情。

如果你看一下libc导出的符号(例如用nm -D /libc/libc.so.6 ),你会发现它实际上并没有提供符号statstat64

对这些函数的调用被包装 – 在编译时(如果可能)由的内联函数 ,或者(失败)由libc_nonshared.a提供的静态链接定义。

调用的实际动态链接函数是__xstat()__xstat64() ; 这些是另外一个参数,一个整数,它是一个版本号,表示调用者期望的struct stat的布局。 尝试挂钩这些。

(所有这一切的要点是允许动态链接的libc支持使用各种不兼容的struct stat布局和mode_t中位的定义的二进制mode_t ;如果你查看/usr/include/sys/stat.h你会发现一个评论此效果fstat()fstat64()lstat()lstat64()mknod()也以同样的方式受到影响。)