C++ 在某些情况下不调用重写fopen函数?
我试图覆盖某个进程的所有与文件相关的函数,作为预加载的库, 我将这段代码编译为一个预加载的库,然后运行该过程并查看标准输出:C++ 在某些情况下不调用重写fopen函数?,c++,c,linux,ld-preload,C++,C,Linux,Ld Preload,我试图覆盖某个进程的所有与文件相关的函数,作为预加载的库, 我将这段代码编译为一个预加载的库,然后运行该过程并查看标准输出: #include <stdio.h> #include <dlfcn.h> FILE *(*original_fopen)(const char*, const char*) = NULL; FILE *fopen(const char *path, const char *mode) { prin
#include <stdio.h>
#include <dlfcn.h>
FILE *(*original_fopen)(const char*, const char*) = NULL;
FILE *fopen(const char *path, const char *mode) {
printf("In our own fopen, opening %s\n", path);
fflush(stdout);
if (!original_fopen) {
original_fopen = (FILE * (*)(const char*, const char*))dlsym(RTLD_NEXT, "fopen");
}
return (*original_fopen)(path, mode);
}
问题是,程序似乎出于某种原因使用libio/iofopen.c中的函数_IO_new_fopen,所以:1。有没有办法强迫它使用fopen?它最初是如何使用这个功能的?或2。我可以覆盖它吗?我试过同样的签名,但没用
更新:
从应用程序的某些地方调用回调,所以我确信这是一些include,必须有一种方法覆盖它。。但是怎么做呢?也许可以解释发生了什么。那么,如果它是一个别名,为什么不调用我的重写函数呢?请注意,我也尝试覆盖open、open64来查找这些调用,但找不到它的外观。我正在正确地拦截所有的fwrite和fread。。对于C来说,不确定POSIX是否有进一步的限制,每个标准函数都可以作为一个宏函数实现,但无论如何都必须有一个实函数,在这种情况下,它必须是未定义的。然而,C++中不确定。在预加载的库中,@ MFSO UNDEF?
LD_PRELOAD=hooks.so ./prog