A implementação do syscall depende do hardware (pesadamente) - veja o artigo da wikipedia sobre syscalls e o artigo sobre kerneltrap . No x86 moderno, parece que int 0x80
foi abandonado em favor dos mais novos SYSENTER
et al há algum tempo .
Para mim, __execve é assim:
000000000040f7c0 <__execve>:
40f7c0: b8 3b 00 00 00 mov $0x3b,%eax
40f7c5: 0f 05 syscall
40f7c7: 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax
40f7cd: 77 02 ja 40f7d1 <__execve+0x11>
40f7cf: f3 c3 repz retq
40f7d1: 48 c7 c2 c0 ff ff ff mov $0xffffffffffffffc0,%rdx
40f7d8: f7 d8 neg %eax
40f7da: 64 89 02 mov %eax,%fs:(%rdx)
40f7dd: 48 83 c8 ff or $0xffffffffffffffff,%rax
40f7e1: c3 retq
40f7e2: 66 90 xchg %ax,%ax
40f7e4: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40f7eb: 00 00 00
40f7ee: 66 90 xchg %ax,%ax
Observe o syscall
no começo. A forma exata da função depende dos sinalizadores de compilação e da arquitetura para a qual o código é compilado - consulte as opções gcc
-mtune
e -march
.
EDITAR: links adicionais interessantes: