Syscall من ASM مضمنة في x86_64 لينكس؟
-
05-07-2019 - |
سؤال
وماذا يفعل هذه القمامة الطباعة بدلا من الخروج برنامجي بأمان؟ يمكنني استخدام نظام يدعو بهذه الطريقة على BSD، وأنا أتساءل ما الذي أحتاج إلى العمل على انجاحه في لينكس.
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
return 0;
}
وشكرا.
المحلول
لماذا هذه القمامة الطباعة بدلا من الخروج برنامجي بأمان؟
اقتباس فقرة>CESA-2009-001 و "Syscall 1 غير الخروج على I386 ولكن الكتابة على x86_64 ".
<اقتباس فقرة>ما أنا بحاجة لجعله يعمل في لينكس
اقتباس فقرة>واستخدم الترتيبية syscall من الحالي <لأ href = "http://git.kernel.org/؟p=linux/kernel/git/stable/linux-2.6-stable.git؛a=blob؛f= قوس / إلى x86 / وتشمل / ASM / unistd_64.h "يختلط =" noreferrer "> unistd_64.h
وآمل أن يساعد هذا!
نصائح أخرى
وSyscall 1 غير الخروج على I386 ولكن الكتابة على إكس86-64 على ما أعتقد.
وتحرير: هذا يبدو غير دقيق: وفقا لشبكة الإنترنت، والتي لا يبدو أن لديها الكثير من المعلومات حول التجمع لينكس إكس86-64 يبدو أن هذا الإعداد السجل المتوقع قبل تعليمات 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??