微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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()也受到同样的影响)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐