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
)导出的符号,您将看到它实际上没有提供符号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()
也影响了同样的方式.)
归档时间: |
|
查看次数: |
2888 次 |
最近记录: |