ld_preload套接字呼叫导致bind()syscall处的分段故障



我正在尝试使用简单AF_INET套接字调用的可执行文件来ld_preload( LD_PRELOAD=./my_lib.so ./a.out)。我想接听电话,然后继续使用AF_VSOCK地址家族而不是AF_INETsocket()connect()效果很好。问题是当我致电bind()时,我会得到一个分段错误(segfault at 60 ip 00007f4f4b2ea59a sp 00007fff9eb53dd8 error 4 in libc-2.13.so[7f4f4b261000+184000]

lib.so:

typedef int (*bind_orig_ftype)(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
    bind_orig_ftype bind_original;
    struct sockaddr_vm vmaddr;
    bind_original= (bind_orig_ftype) dlsym(RTLD_NEXT,"bind");
    vmaddr.svm_family = AF_VSOCK;
    vmaddr.svm_cid = 42;
    vmaddr.svm_port = 1234;
    printf("Interceptedn");
    return (bind_original(sockfd,(struct sockaddr *) &vmaddr,sizeof(struct sockaddr)));
}

我打印了"截获",然后是segfault。我认为问题是关于struct sockaddr_vm将其传递给bind_original,但是当我在 AF_VSOCK拨打bind时,而ld_preloaderoad toding一切都很好。

有什么想法吗?或如何检查Sefault发生的位置?

更改地址类型还需要更改套接字域。

请参阅我转换AF_INET套接字以通过LD_PRELOAD使用AF_UNIX的答案。

如果您需要一个支持AF_VSOCK的完整库,则对于 vhost-vsock 以及 firecracker - 风格的多重UNIX域插座,请看一下Unsock。

相关内容

  • 没有找到相关文章

最新更新