Linux 为什么';fopen()调用时,t ldu预加载技巧catch open()?

Linux 为什么';fopen()调用时,t ldu预加载技巧catch open()?,linux,ld-preload,Linux,Ld Preload,我使用LD\u PRELOAD技巧捕获open64()调用,我想我知道如何正确地执行:使用从 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { open64("foobar.txt", 0); return 0; } 但是,当将open64替换为fopen64时: #include <stdio.h> int main() {

我使用
LD\u PRELOAD
技巧捕获
open64()
调用,我想我知道如何正确地执行:使用从

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {
  open64("foobar.txt", 0);
  return 0;
}
但是,当将
open64
替换为
fopen64
时:

#include <stdio.h>

int main() {
  fopen64("foobar.txt", "r");
  return 0;
}
显示

libc.so.6 => /lib64/libc.so.6 
哪一个是共享库,以及

>nm /lib64/libc.so.6

显示定义的
open64
fopen64
(但不是
fopen
,这就是为什么在问题中,我使用“64”版本作为参数的原因;也许
fopen
fopen64
的宏或类似的东西,没有关系,因为问题发生在有64或没有64的情况下)

我认为它是这样工作的:用户空间程序在libc中调用库函数,libc在内核中调用系统调用。使用LD_PRELOAD可以拦截程序和libc之间的libc调用。您不能拦截系统调用。如果glibc在内部调用另一个函数(例如fopen调用open),则无法拦截它

在这种情况下,最好使用
ltrace
,而不是使用
strace
,因为它显示完成了哪些库调用。这些是您可以拦截的呼叫


您需要使用
PTRACE\u SYSCALL
。下面是一个。

ltrace[sic]和/或LD_DEBUG=这两者之间有什么区别吗?@pilcrow不知道你的意思。。。我解释了上面的所有内容,
strace
显示了
open(foobar.txt
..(以及其他不相关的东西),
LD\u PRELOAD
没有显示任何内容。有同样的问题。想知道发生了什么。
libc.so.6 => /lib64/libc.so.6 
>nm /lib64/libc.so.6