【发布时间】:2016-06-16 17:35:22
【问题描述】:
我使用LD_PRELOAD 技巧来捕获open64() 调用,我想我知道如何正确地做到这一点:使用编译自的程序foobar
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
open64("foobar.txt", 0);
return 0;
}
如我所料,我抓住了open64:
>LD_PRELOAD=$PWD/catch.so ./foobar
open64 called
但是,当open64 被fopen64 替换时:
#include <stdio.h>
int main() {
fopen64("foobar.txt", "r");
return 0;
}
现在open64 未被捕获。为什么?
如果fopen64 调用open,我确实同时拦截了open 和open64,没有一个被捕获。
程序foobar 的两个版本在与strace 一起执行时都显示open 被调用,这意味着fopen64 确实在内部调用open 或open64。
我认为也许某些东西是静态链接的,但事实并非如此:
>ldd foobar
显示
libc.so.6 => /lib64/libc.so.6
这是一个共享库,并且
>nm /lib64/libc.so.6
按定义显示open64 和fopen64(但不是fopen,这就是为什么在问题中,我使用“64”版本作为参数;也许fopen 是@987654348 的宏@ 或类似的东西,没关系,因为无论有没有 64 都会出现问题)。
【问题讨论】:
-
ltrace [sic] 和/或 LD_DEBUG=all 向您展示了两者之间的哪些区别?
-
@pilcrow 不确定你的意思...我在上面解释了所有这些,
strace显示open(foobar.txt...(和其他不相关的东西),LD_PRELOAD什么也没显示。跨度> -
有同样的问题。想知道发生了什么。
标签: linux ld-preload