在某些情况下不会调用覆盖fopen函数?

时间:2014-10-29 16:11:57

标签: 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) {
        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);

}

可以使用g++ -Wall -fPIC -shared -o hooks.so hooks.cpp -ldl

进行编译

然后只使用任何使用fifos的程序:

LD_PRELOAD=hooks.so ./prog

问题是,似乎该程序出于某种原因使用来自libio / iofopen.c的函数_IO_new_fopen,所以:1。有没有办法强制它使用fopen?它最初是如何使用此功能的?或2.我可以覆盖它吗?我尝试了相同的签名,但它没有用..

更新: 从应用程序的某些地方调用回调 ,所以我确定这是一些包含,并且必须有一种方法来覆盖它..但是如何?

0 个答案:

没有答案