我已经为open() syscall编写了一个包装器,并使用LD_PRELOAD环境变量对其进行了预加载。我只希望程序的一些功能使用修改后的open(),而其他功能则使用原始功能。不能将功能分开在两个程序中,因为一个程序调用另一个程序。如何做呢?

最佳答案

在以下示例中,函数插入的使用类似于this answer

该示例提供了一个write()包装函数,该函数调用原始write()。重要的是要注意,您不能直接调用原始write(),因为它将被解释为对包装器的调用。在main()中使用函数指针演示了如何避免对正在调用的write()的混淆。

代码: test.c

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>

size_t write(int fd, const void *buf, size_t count)
{
    static size_t (*write_func)(int, const void *, size_t) = NULL;

    /* get reference to original (libc provided) write */
    if (!write_func)
    {
        write_func = (size_t(*)(int, const void *, size_t)) dlsym(RTLD_NEXT, "write");
    }

    /* perform wrapper specific actions */
    /* ... */

    /* call original write() */
    return  write_func(fd, buf, count);
}

int main(int argc, char *argv[])
{
    size_t (*wrap_write)(int, const void *, size_t);
    size_t (*orig_write)(int, const void *, size_t);
    char buf1[] = "write() wrapper called\n";
    char buf2[] = "orignial write() called\n";

    /* set pointer to write() wrapper to differentiate */
    wrap_write = write;
    /* get reference to original (libc provided) write() */
    orig_write = (size_t(*)(int, const void *, size_t)) dlsym(RTLD_NEXT, "write");

    /* call write() wrapper */
    wrap_write(1, buf1, strlen(buf1));
    /* call original write() */
    orig_write(1, buf2, strlen(buf2));

    return 0;
}

输出:

10-08 09:09
查看更多