我正在尝试LD_PRELOAD(Float
)一个带有简单LD_PRELOAD=./my_lib.so ./a.out
套接字调用的可执行文件。
我想接听电话,然后使用AF_INET
地址系列代替AF_VSOCK
。
AF_INET
,socket()
效果很好。问题是当我调用connect()
时出现分段错误
(bind()
)
lib.so:
segfault at 60 ip 00007f4f4b2ea59a sp 00007fff9eb53dd8 error 4 in libc-2.13.so[7f4f4b261000+184000]
我打印了“Intercepted”,然后是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("Intercepted\n");
return (bind_original(sockfd,(struct sockaddr *) &vmaddr,sizeof(struct sockaddr)));
}
。我认为问题是关于segfault
将它传递给bind_original,但是当我在struct sockaddr_vm
调用bind时,没有LD_PRELOADing,一切运行良好。
有什么想法吗?或者如何检查sefault发生的位置?