您好,我正在尝试学习如何在Linux上使用x86_64程序集进行系统调用。我遇到了一个问题,我似乎无法弄清楚如何正确地传递的参数getpeername
。
在使用C的此链接中,似乎他们正在使用运算符的地址来传递参数。我不知道如何在程序集中复制它。当我在缓冲区中不使用方括号时,这是strace。
首先,我在.data节中定义了我的缓冲区
ip_buff: times 14 db 0 .length: equ $-ip_buff
这是一个宏
%define SYS_getpeername 52
r12
存储套接字接受调用的返回值
syscall getpeername,r12,ip_buff,15
这是不使用方括号的strace
[pid 749] accept(3, NULL, NULL[pid 761] read(4, "", 1024) = 0 [pid 761] write(1, "", 0) = 0 [pid 761] getpeername(4, 0x600733, 0xf) = -1 EFAULT (Bad address)
这是我使用方括号时的痕迹。
[pid 749] accept(3, NULL, NULL[pid 745] read(4, "GET / HTTP/1.1\r\nHost: 127.0.0.1:"..., 1024) = 78 [pid 745] write(1, "GET / HTTP/1.1\r\nHost: 127.0.0.1:"..., 78) = 78 [pid 745] getpeername(4, NULL, 0xf) = -1 EFAULT (Bad address)
我该如何正确进行系统调用?
实际的问题不是缓冲区,而是缓冲区的长度。请注意,在原型中您socklen_t *addrlen
应该拥有一个指针。15
您传递的值不是指针,因此不是-EFAULT
。
您应该将更.length: equ $-ip_buff
改为ip_length: dd $-ip_buff
,然后使用syscall getpeername,r12,ip_buff,ip_length