我已经为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;
}
输出: