¿Syscall desde inline asm en x86_64 Linux?
-
05-07-2019 - |
Pregunta
¿Por qué esto imprime basura en lugar de salir de mi programa con gracia? Utilizo las llamadas al sistema de esta manera en BSD, y me pregunto qué necesitaría para que funcione en Linux.
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq <*>,%rdi; syscall"); /* exit(0) ? */
return 0;
}
Gracias.
Solución
¿Por qué esto imprime basura en lugar de salir de mi programa con gracia?
Por CESA-2009-001 , " Syscall 1 es salga en i386 pero escriba en x86_64 " ;.
¿Qué necesitaría para que funcione en Linux?
Use los ordinales syscall de los actuales unistd_64.h
Espero que esto ayude!
Otros consejos
Syscall 1 es exit en i386 pero escriba en x86-64, creo.
EDITAR: esto parece inexacto: Según la web, que no parece tener demasiada información sobre el ensamblaje de Linux x86-64, esta parece ser la configuración de registro esperada antes de la instrucción syscall.
rax system call number
rbx arg0
rcx return address from syscall
rdx arg2
rsi arg3
rdi arg4
r8 arg5
r9 arg1 (expected by gcc in %rcx)
r10-r15 should be saved/restored by C code
rbp dito What is dito??