c和LD_PRELOAD。 拦截open和open64调用,但不是stat64
我做了一个小的共享库,试图拦截open,open64,stat和stat64 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
!
对这些函数的调用被包装 – 在编译时(如果可能)由
的内联函数
,或者(失败)由libc_nonshared.a
提供的静态链接定义。
调用的实际动态链接函数是__xstat()
或__xstat64()
; 这些是另外一个参数,一个整数,它是一个版本号,表示调用者期望的struct stat
的布局。 尝试挂钩这些。
(所有这一切的要点是允许动态链接的libc
支持使用各种不兼容的struct stat
布局和mode_t
中位的定义的二进制mode_t
;如果你查看/usr/include/sys/stat.h
你会发现一个评论此效果fstat()
, fstat64()
, lstat()
, lstat64()
和mknod()
也以同样的方式受到影响。)