我想从我自己的fopen实现中调用libc.so中定义的fopen()。是否可以在不依赖dlsym、dlopen(以及LD_LIBRARY)的情况下执行此操作?

最佳答案

我不知道这是否是个好主意,但你可以调用自己的fopen其他东西,例如do_fopen并编写一个宏fopen来重定向到该函数。在包装器中调用fopen时,#undef fopen或将fopen放在括号中以避免宏扩展:

#include <stdlib.h>
#include <stdio.h>

#define fopen(fn, mode) do_fopen(fn, mode)

FILE *do_fopen(const char *fn, const char *mode)
{
    FILE *f = (fopen)(fn, mode);

    fprintf(stderr,
        "fopen(\"%s\", \"%s\") == %p\n", fn, mode, f);
    return f;
}

int main(int argc, char *argv[])
{
    FILE *f;

    f = fopen(argv[1], "r");
    if (f) {
        /* do stuff */
    }
    fclose(f);

    return 0;
}

这个技巧只适用于来自您自己的代码的fopen调用,而不是来自库的。

关于c - 如何在没有dlsym的另一个共享库中调用具有相同名称的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26345172/

10-14 05:05