我做了一个小共享库,试图拦截 open、open64、stat 和 stat64 sys 调用。当我导出 LD_PRELOAD 并运行 oracle 的 sqlplus 时,我可以看到 open 和 open64 调用的痕迹,但没有 stat 和 stat64 调用的痕迹。共享库是一个单独的 c 文件,其中包含 sys 调用的所有定义。为什么会发生某些系统调用被拦截而其他系统调用不被拦截的情况?谢谢你的帮助。
问问题
3405 次
1 回答
19
因为 GNUlibc
实现了open()
and ,open64()
正如你所期望的(即它们只是动态链接的符号,你可以用 挂钩LD_PRELOAD
),但是用stat()
and做了一些特殊的事情stat64()
。
如果您查看由libc
(例如使用nm -D /libc/libc.so.6
)导出的符号,您会发现它实际上并没有提供符号stat
或stat64
!
对这些函数的调用被包装 - 在编译时(如果可能)由 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 回答