选择性调用写包装器

时间:2011-06-27 12:27:40

标签: c linux wrapper

我拦截了写库函数以重定向写入,但只想对包装器进行少量写入,而其他(用于写入套接字)应该转到原始的libc函数。尝试过使用dlsym但似乎没有用。

使用了LD-PRELOAD环境变量

非常感谢帮助

编辑: 代码的一部分

int call_execute()
{
.....
    static ssize_t (*real_write)(int,const void*,size_t) = NULL;
...

    real_write= (size_t(*)(int,const void*,size_t)dlsym(RTLD_NEXT,"write");

...
    real_write(sockfd,argcalls[i],strlen(argcalls[i]));

}

2 个答案:

答案 0 :(得分:1)

#include <unistd.h>
#include <stdio.h>
#include <dlfcn.h>

typedef ssize_t (*readf)(int, void *, size_t);

ssize_t
read(int fd, void *buf, size_t count) {
    readf p = dlsym(RTLD_NEXT, "read");
    printf("passing read with %d bytes\n", count);
    return p(fd, buf, count);
}

$ gcc -W -Wall -shared -o /tmp/libpre.so test.c -ldl

$ env LD_PRELOAD = / tmp / libpre.so cat / dev / null

上面应该产生这样的输出:

以32768字节传递读取

答案 1 :(得分:0)

如果dlsym(RTLD_NEXT, "write")未返回libc函数,则可以显式声明所需的库,例如:克。

void *handle = dlopen("libc.so.6", RTLD_LAZY);
if (!handle) puts(dlerror()), exit(1);
typeof(&write) real_write = dlsym(handle, "write");

- 但是如果你没有首先使用LD_PRELOAD并在主程序中定义你的写包装器那么也许会更容易 - 那么RTLD_NEXT应该可以工作。