以下のプログラムは SEGMENTATION FAULT を引き起こします。このRET
命令は、RETURN ADDRESS TO SYSTEM を回復しません。
gdb でセッションをデバッグすると、戻りアドレスがスタック上にないことがわかります。最初の命令pushq %rbp
の前に、%rsp
スタック ポインターはリターン アドレスではない 0x00000000 アドレスを参照し、SEGMENTATION DEFAULT を引き起こします。
デバッグ セッションで、_start ラベルにブレークポイントを設定すると、最初に実行する命令はエピローグではなく、プロローグです。
システム呼び出し操作がスタック ポインターで正しく動作せず、戻りアドレスを保存しないことは明らかです。
古い 32 ビット プラットフォームでは、この問題は発生しませんでした。
¿いくつかのアイデア? 前もって感謝します。
gdb セッション:
Reading symbols from /home/candido/tutoriales/as_tutorial/examples/basicos_64/nada/ret_fault...done.
(gdb) b _start
Breakpoint 1 at 0x40007c: file ret_fault.s, line 15.
(gdb) run
Starting program: /home/candido/tutoriales/as_tutorial/examples/basicos_64/nada/ret_fault
(gdb) x /x $rsp
0x7fffffffe068: 0x00000000
(gdb)
ソースコードとして:
### Simple Prologue Epilogue Module
### System call don't save the RETURN ADDRESS
### Assembling: as -gstabs -o ret_fault.o ret_fault.s
### Linking: ld -o ret_fault ret_fault.o
### Execution: ./ret_fault
### System warning: SEGMENTATION FAULT
### System platform: Linux lur 3.2.0-33-generic #52-Ubuntu SMP x86_64 GNU/Linux
.text
.globl _start
_start:
## Epilogue
pushq %rbp # save calling frame pointer
movq %rsp, %rbp # set called frame pointer
## Prologue
movl $0, %eax # set return value
popq %rbp # restore calling frame pointer
ret # return to system. Get return address from stack and load on RIP register.
.end