我做了一个共享库,试图拦截open,open64,stat和stat64 sys调用.
当我导出LD_PRELOAD并运行oracle的sqlplus时,我可以看到open和open64调用的跟踪,但没有stat和stat64调用的跟踪.
共享库是一个单个c文件,其中包含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),您将看到实际上并不提供符号stat或stat64!
对这些函数的调用是在编译时(如果可能的话)被包含在< 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()也受到同样的影响)