10

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

4

1 回答 1

19

因为 GNUlibc实现了open()and ,open64()正如你所期望的(即它们只是动态链接的符号,你可以用 挂钩LD_PRELOAD),但是用stat()and做了一些特殊的事情stat64()

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

对这些函数的调用被包装 - 在编译时(如果可能)由 in 中的内联函数<sys/stat.h>或(失败)由libc_nonshared.a.

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

(所有这一切的重点是允许动态链接libc以支持二进制文件,这些二进制文件使用 中的各种不兼容的布局和struct stat位定义mode_t;如果您查看,您会/usr/include/sys/stat.h发现对此效果的 注释。同样的方法。)fstat()fstat64()lstat()lstat64()mknod()

于 2011-03-29T23:56:02.507 回答