2016-09-09 10 views
2

は、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になるべきではありませんか?なぜ現在の$rbp0x7ff7143fbb00ですか?誰かがこのギャップを埋め尽くすのに役立つだろうか?私の理解で

答えて

3

、呼び出し規約x86_64版は、リターンアドレス別名保存$リッピングは、現在のフレームベースの$ RBP上の権利であることを指定し

あなたの理解は完全に間違っです:x86_64 ABIが指定されていません。フレームレジスタとして$RBP$RBPの値は何でもかまいません。

、最適化せずに、または-fno-omit-frame-pointerで、又はallocaを使用するルーチンで、または引数の可変数のルーチンでコンパイル、$RBP通常フレームポインタとして使用あります。しかし、ではない他のルーチンではなく、libc.so.6内部など

はあなたがGDBを停止しているルーチン、またはそのルーチンがコンパイルされたか、または言わなかった

でもそのルーチン内はあなたがほとんどのように停止されている場合あなたが提供したGDBの出力に意味のある文脈が欠落しています。

関連する問題