【问题标题】:syscall return 07 when call _exit调用_exit时系统调用返回07
【发布时间】:2013-03-25 03:35:35
【问题描述】:

我正在寻找内核 3.8.4 x64 nasm gcc-4.7.2 fedora 的论文 Size Is EverythingSize Is Everything

按类型输入 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 ,我不知道为什么。

【问题讨论】:

    标签: linux gcc nasm elf system-calls


    【解决方案1】:

    x86_64 abi 指定参数传递约定。

    在这种情况下:

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

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

    这在您对_exit 函数调用的单步调试中非常明显。

    【讨论】:

    • 谢谢您,我应该阅读您提供的论文。使用 %rdi 可以看到我想看到的。
    • 此时我对wc -c a.out 的调用仍然给出了相当大的 5144 - 与我使用早期使用 main 的代码得到的 5928 相比。 (32 位)文章看到从 2604 到 1340 的减少幅度更大。
    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 2012-02-11
    • 2014-08-16
    • 2012-01-24
    • 2016-05-23
    • 2012-10-07
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多