【问题标题】:Write System Call Argument Registers写系统调用参数寄存器
【发布时间】:2015-06-13 15:36:11
【问题描述】:

我有一段汇编代码,它通过write system call(正确吗?)

call write@plt

在此之前,rax、地址rspedirsirdx 的值已设置/修改。

我如何知道哪些寄存器通常用作写入或系统函数调用的参数?

我的猜测是 rspedirsi 因为在 C 中需要 3 个参数:

ssize_t write(int fd, const void *buf, size_t nbytes);

【问题讨论】:

标签: c linux assembly x86


【解决方案1】:

当您 call write@plt 时,您不会直接调用 write(2) 系统调用,而是围绕它的一个小型包装器(一个小型​​ C 函数,它执行系统调用并在失败时设置 errno )。

所以这个write 函数使用标准C calling convention,在ABI(应用程序二进制接口)中定义。对于 Linux x86-64,请阅读 SysV ABI interface for x86-64

另请阅读vdso(7) 以了解更多有关某些系统调用实际完成的信息。其他人可能使用SYSENTER 机器指令等... ABI 规范中给出了一些细节(严格意义上,真正的syscall 不使用任何堆栈并通过寄存器传递参数和结果)。另请阅读Linux Assembly HowTo(更关注 32 位 x86)。

另外,Linux 的C standard librariesfree software,一般是GNU glibc 或者可能是musl-libc,等等...所以研究它们的源代码以准确了解write 是如何实现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2014-10-15
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多