c - 如何在没有 dlsym 的情况下调用具有相同名称但在另一个共享库中的函数?

标签 c hook

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

相关文章:

git 分支删除 - HOOK

c - 为什么我的 ASCII 到数字程序会得到相同的读数?

c - 未发现泄漏时调试段错误的技巧

c - Hook - 热修补

php - Codeigniter,钩子(Hook)未正确加载输入类

c++ - 键盘 Hook 与所有桌面交互 c++ win32

C# Hook vmtable

c - 数组函数从数组中删除第一个字符

C - 同时从两个管道(父进程从两个子进程)读取?

c - 如何在此 C 函数中将任何内容分配给数组?