c和LD_PRELOAD.打开和open64调用被截获,但不是stat64

c和LD_PRELOAD.打开和open64调用被截获,但不是stat64,第1张

概述我做了一个共享库,试图拦截open,open64,stat和stat64 sys调用. 当我导出LD_PRELOAD并运行oracle的sqlplus时,我可以看到open和open64调用的跟踪,但没有stat和stat64调用的跟踪. 共享库是一个单个c文件,其中包含sys调用的所有定义. 为什么会发生一些系统调用被拦截而其他系统调用没有? 谢谢你的帮助. 因为GNU libc按照你所期望的那 我做了一个共享库,试图拦截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()也受到同样的影响)

总结

以上是内存溢出为你收集整理的c和LD_PRELOAD.打开和open64调用被截获,但不是stat64全部内容,希望文章能够帮你解决c和LD_PRELOAD.打开和open64调用被截获,但不是stat64所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1251497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存