您好,我正在尝试学习如何在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
这是不使用方括号的条迹
[pid 749] accept(3, NULL, NULL <unfinished ...>
[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 <unfinished ...>
[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)
如何正确进行此系统调用?
答案 0 :(得分:5)
实际的问题不是缓冲区,而是缓冲区的长度。请注意,在原型中您有socklen_t *addrlen
,所以它应该是一个指针。您传递的值15
不是指针,因此不是-EFAULT
。
您应将.length: equ $-ip_buff
更改为ip_length: dd $-ip_buff
,然后使用syscall getpeername,r12,ip_buff,ip_length