は、x86_64の呼び出し規約がsaved $rip
別名return address
が右、現在のフレームベース$rbp
を超えるべきであることを指定し解釈する方法 - 例えば:GDB:x86_64版のコールスタック&レジスタ(具体的RBPドル)私の理解で
8(%rbp) return address
0(%rbp) previous %rbp value
呼び出し規約x86_64のため参考文献:しかし http://6.035.scripts.mit.edu/sp16/x86-64-architecture-guide.html http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/
、私はからもらったフレームと$rbp
レジスタプロセスのが、私には意味がありません。
レジスタ:
(gdb) info registers
rax 0xfffffffffffffffc -4
rbx 0x7ff7143fbc40 140699173370944
rcx 0xffffffffffffffff -1
rdx 0x80 128
rsi 0x7ff7143fb4e0 140699173369056
rdi 0x9 9
rbp 0x7ff7143fbb00 0x7ff7143fbb00
rsp 0x7ff7143fb4c0 0x7ff7143fb4c0
r8 0x7ff715e2a630 140699200824880
r9 0xa072 41074
r10 0x493e0 300000
r11 0x293 659
r12 0x7ff715e2a600 140699200824832
r13 0x7ff715e2a630 140699200824880
r14 0x7ff7143fb4e0 140699173369056
r15 0x7ff715c73078 140699199025272
rip 0x7ff71d466f33 0x7ff71d466f33 <epoll_wait+51>
eflags 0x293 [ CF AF SF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
フレーム:
(gdb) info frame
Stack level 0, frame at 0x7ff7143fb4d0:
rip = 0x7ff71d466f33 in epoll_wait; saved rip = 0x459347
called by frame at 0x7ff7143fbb10
Arglist at 0x7ff7143fb4b8, args:
Locals at 0x7ff7143fb4b8, Previous frame's sp is 0x7ff7143fb4d0
Saved registers:
rip at 0x7ff7143fb4c8
私はスタックポインタ($rsp
、$rsp+0x8
から戻って通過する場合には、 $rsp+0x10
など)、私はスタック上でsaved $rip
を見つけることができるはずです。良いことは - 私はをやった!
(gdb) x/8x 0x7ff7143fb4c8
0x7ff7143fb4c8: 0x47 0x93 0x45 0x00 0x00 0x00 0x00 0x00
質問:あなたがここに見ることができるように
、アドレス0x7ff7143fb4c8
で8バイトのメモリは、GDBでinfo frame
からsaved $rip
と全く同じです。これによると、$rbp
の値は、x86_64呼び出し規約に従って0x7ff7143fb4c0
になるべきではありませんか?なぜ現在の$rbp
は0x7ff7143fbb00
ですか?誰かがこのギャップを埋め尽くすのに役立つだろうか?私の理解で