То, что "call *%2"
в вашей встроенной сборке кажется неправильным. И вы можете проверить это в gdb
довольно легко:
(gdb) layout asm
(gdb) break main
Breakpoint 1 at 0x5eb: file test.c, line 31.
(gdb) run
Код, сгенерированный из встроенного ассемблера, выглядит для меня так:
0x5655562b <main+94> mov -0x34(%ebp),%eax
0x5655562e <main+97> mov $0x1,%ebx
0x56555633 <main+102> mov -0x28(%ebp),%ecx
0x56555636 <main+105> mov -0x30(%ebp),%edx
0x56555639 <main+108> call *-0x28(%ebp)
Перерыв по адресу вызова:
(gdb) break *0x56555639
(gdb) c
(gdb) si
Cannot access memory at address 0x6c6c6568)
Я думаю, что ваша сборка должна выглядеть примерно так:
asm ("movl %0, %%eax\n"
"movl %1, %%ebx\n"
"movl %2, %%ecx\n"
"movl %3, %%edx\n"
"call *%4"
:
:"m" (syscall_num), "i"(1), "m" (buffer), "m"(buffer_length), "m"(sysinfo)
:"eax", "ebx", "ecx", "edx");
Обратите внимание, что вы также пропустили edx
в своем списке тупиков.