调用_exit时,系统调用返回07

时间:2013-04-03 12:51:58

标签: linux gcc nasm elf system-calls

我正在寻找一篇文章Size Is EverythingSize Is Everything内核3.8.4 x64 nasm gcc-4.7.2 fedora

按类型in moretiny.asm

BITS 64

EXTERN _exit
GLOBAL _start
SECTION .text

_start:
    push dword 42
    call  _exit

\>nasm -f elf64 moretiny.asm 
\>gcc -Wall -s -nostartfiles -o moretiny.
\>./a.out ; echo $?

7

使用gdb帮助。在_exit

处休息
(gdb) display /i $pc
1: x/i $pc
=> 0x3a5e0bb750 <_exit>:    movslq %edi,%rdx
(gdb) si
0x0000003a5e0bb753 in _exit () from /lib64/libc.so.6
1: x/i $pc
=> 0x3a5e0bb753 <_exit+3>:  mov    0x2f56de(%rip),%r10        # 0x3a5e3b0e38
(gdb) 
0x0000003a5e0bb75a in _exit () from /lib64/libc.so.6
1: x/i $pc
=> 0x3a5e0bb75a <_exit+10>: mov    $0xe7,%r9d
(gdb) 
0x0000003a5e0bb760 in _exit () from /lib64/libc.so.6
1: x/i $pc
=> 0x3a5e0bb760 <_exit+16>: mov    $0x3c,%r8d
(gdb) 
0x0000003a5e0bb766 in _exit () from /lib64/libc.so.6
1: x/i $pc
=> 0x3a5e0bb766 <_exit+22>: jmp    0x3a5e0bb781 <_exit+49>
(gdb) 
0x0000003a5e0bb781 in _exit () from /lib64/libc.so.6
1: x/i $pc
=> 0x3a5e0bb781 <_exit+49>: mov    %rdx,%rdi
(gdb) 
0x0000003a5e0bb784 in _exit () from /lib64/libc.so.6
1: x/i $pc
=> 0x3a5e0bb784 <_exit+52>: mov    %r9d,%eax
(gdb) 
0x0000003a5e0bb787 in _exit () from /lib64/libc.so.6
1: x/i $pc
=> 0x3a5e0bb787 <_exit+55>: syscall 
(gdb) 
[Inferior 1 (process 32082) exited with code 07]

似乎系统调用用07返回代码,我不知道为什么。

1 个答案:

答案 0 :(得分:3)

x86_64 abi指定传递约定的参数。

在这种情况下:

  

如果类是INTEGER,则序列%rdi的下一个可用寄存器,   使用%rsi,%rdx,%rcx,%r8和%r9。

所以你应该使用%rdi寄存器而不是推入堆栈。

从您对_exit函数调用的单步调试中可以看出这一点。