2013-04-03 22 views
2

我找一紙Size Is EverythingSize Is Everything內核3.8.4 NASM x64的GCC-4.7.2的Fedora系統調用返回07時調用_exit

通過類型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 $? 

有了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返回代碼,我不知道爲什麼。

回答

3

x86_64 abi指定參數傳遞約定。

在這種情況下:

如果類INTEGER,序列%RDI的下一個可用的寄存器, %RSI,%RDX,RCX%,%R 8和R 9%是used12。

所以你應該使用%rdi寄存器,而不是推入堆棧。

這很明顯從您的單步調試到_exit函數調用中。

+0

謝謝,我應該讀你提供的論文。使用%rdi可以看到我想看到的內容。 – jiamo

+0

在這一點上,我調用'wc -c a.out'仍然給出了一個相當大的5144--與我之前使用main的代碼獲得的5928相比。 (32位)文章看到從2604減少到1340。 – user2023370