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

kla*_*yme 10 c system-calls stat preload interception

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

Mat*_*ery 18

因为GNU libc实现open()并且open64()正如您所期望的那样(即它们只是动态链接的符号,您可以使用它们LD_PRELOAD),但是使用stat()和执行特殊操作stat64().

如果您查看由libc(例如with nm -D /libc/libc.so.6)导出的符号,您将看到它实际上没有提供符号statstat64!

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

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

(所有这一切的一点是允许动态链接libc支持利用各种不兼容的二进制布局struct stat和位的定义mode_t;如果你在看/usr/include/sys/stat.h,你会发现这种效果的注释 fstat(),fstat64(),lstat(),lstat64()并且mknod()也影响了同样的方式.)