我做了一个小的共享库,试图拦截 open、open64、stat 和 stat64 系统调用。
当我导出LD_PRELOAD并运行oracle的sqlplus时,我可以看到open和open64调用的痕迹,但看不到stat和stat64调用的痕迹。
共享库是一个单独的 c 文件,其中包含 sys 调用的所有定义。
为什么有些系统调用被拦截,而另一些却没有?
感谢您的帮助。
因为 GNUlibc
实施open()
and open64()
正如您所期望的那样(即它们只是动态链接的符号,您可以使用LD_PRELOAD
),但是做了一些特别的事情stat()
and stat64()
.
如果您查看导出的符号libc
(例如与nm -D /libc/libc.so.6
),你会发现它实际上并没有提供符号stat
or stat64
!
对这些函数的调用被包装 - 或者在编译时(如果可能)通过内联函数<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()
and mknod()
也会受到同样的影响。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)