如何正确地将缓冲区指针传递给x86_64程序集中的Linux系统调用?

时间:2019-07-18 15:06:27

标签: linux assembly x86-64 system-calls

您好,我正在尝试学习如何在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)

如何正确进行此系统调用?

1 个答案:

答案 0 :(得分:5)

实际的问题不是缓冲区,而是缓冲区的长度。请注意,在原型中您有socklen_t *addrlen,所以它应该是一个指针。您传递的值15不是指针,因此不是-EFAULT

您应将.length: equ $-ip_buff更改为ip_length: dd $-ip_buff,然后使用syscall getpeername,r12,ip_buff,ip_length