我正在尝试使用简单AF_INET
套接字调用的可执行文件来ld_preload( LD_PRELOAD=./my_lib.so ./a.out
)。我想接听电话,然后继续使用AF_VSOCK
地址家族而不是AF_INET
。 socket()
,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。