首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择性调用写入包装器

选择性调用写入包装器
EN

Stack Overflow用户
提问于 2011-06-27 20:27:40
回答 2查看 126关注 0票数 0

我截取了write库函数来重定向写操作,但是只想对包装器uae进行一些写操作,而其他的(用于写套接字)应该转到原来的libc函数。我尝试过使用dlsym,但似乎没有效果。

我使用了LD-PRELOAD环境变量

会感激你的帮助

编辑:代码的一部分

代码语言:javascript
复制
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]));

}
EN

回答 2

Stack Overflow用户

发布于 2011-06-27 21:08:38

代码语言:javascript
复制
#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字节传递read

票数 1
EN

Stack Overflow用户

发布于 2014-02-17 17:29:12

如果dlsym(RTLD_NEXT, "write")没有返回libc函数,你可以显式地声明你想要的库,例如。

代码语言:javascript
复制
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应该可以工作,这可能会更容易。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6492828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档