Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在某些情况下不调用重写fopen函数?_C++_C_Linux_Ld Preload - Fatal编程技术网

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