我想从我自己的 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/