c和LD_PRELOAD.打开和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!

对这些函数调用是在编译时(如果可能的话)被包含在< 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()也受到同样的影响)

相关文章

当我们使用GPU进行快速运算时,虽然可以用成熟的深度学习框架...
继上一篇文章学习使用C++存储一个不规则二维数组之后...
本文介绍了一个在C++内部调用Python中封装的函数或者...
本文介绍了一个在C++中保存不定长二维数组的数据结构...
本文主要是站在一个有一定的Python经验的C++新手的角...
本文简单的介绍了C++中的三种基础操作:逐行读取文件...