我想检查在glibc中执行系统调用的代码。我找到了类似的东西。
ENTRY (syscall)
movq %rdi, %rax /* Syscall number -> rax. */
movq %rsi, %rdi /* shift arg1 - arg5. */
movq %rdx, %rsi
movq %rcx, %rdx
movq %r8, %r10
movq %r9, %r8
movq 8(%rsp),%r9 /* arg6 is on the stack. */
syscall /* Do the system call. */
cmpq $-4095, %rax /* Check %rax for error. */
jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */
L(pseudo_end):
ret /* Return to caller. */
现在我的问题是系统调用(在cmpq
指令之前)是否是指令?其次,如果它是一个指令,ENTRY(系统调用)的含义是什么? ENTRY的同名(我不知道ENTRY是什么)和指令?其次,什么是L(pseudo_end)?
答案 0 :(得分:10)
syscall
是x86-64中的指令,用作ABI for making system calls的一部分。 (32位ABI使用int 80h
或sysenter
,也可以在64位模式下使用,但使用64位代码的32位ABI是一个坏主意,特别是对于使用指针参数。)
但是还有一个C library function named syscall(2)
,它是系统调用ABI的通用包装器。您的代码显示该函数的转储,包括将返回值解码为errno
- 设置。 ENTRY(syscall)
只是意味着函数从那里开始。
L()
和ENTRY()
是CPP宏。
L(pseudo_end)
只是一个可以成为跳跃目标的标签。也许SYSCALL_ERROR_LABEL
处的代码会跳回到那里,尽管这个代码块只有ret
会更有效,所以它可能是以前版本的遗留物,或用于其他东西。< / p>
答案 1 :(得分:5)
是的,syscall
是关于x86-64的说明。在i686上有类似的指令sysenter
。
ENTRY(syscall)
将是一个宏。可能会扩展到符号定义,你必须为此而努力。