当我导出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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)