用gdb在指令中间反汇编?

时间:2019-01-09 15:27:33

标签: gdb

我相信以前这种方法很完美,但是也许我只是忘记了正确的语法。

(gdb) disas main
Dump of assembler code for function main:
   0x0000000000001125 <+0>: push   rbp
   0x0000000000001126 <+1>: mov    rbp,rsp
   0x0000000000001129 <+4>: mov    DWORD PTR [rbp-0x4],edi
   0x000000000000112c <+7>: mov    QWORD PTR [rbp-0x10],rsi
   0x0000000000001130 <+11>:    mov    eax,0x0
   0x0000000000001135 <+16>:    pop    rbp
   0x0000000000001136 <+17>:    ret    

现在我想在0x0000000000001127处反汇编,这是第一个mov指令的1个字节:

(gdb) disas 0x0000000000001127
Dump of assembler code for function main:
   0x0000000000001125 <+0>: push   rbp
   0x0000000000001126 <+1>: mov    rbp,rsp
   0x0000000000001129 <+4>: mov    DWORD PTR [rbp-0x4],edi
   0x000000000000112c <+7>: mov    QWORD PTR [rbp-0x10],rsi
   0x0000000000001130 <+11>:    mov    eax,0x0
   0x0000000000001135 <+16>:    pop    rbp
   0x0000000000001136 <+17>:    ret    

它仍然在main的顶部开始拆卸。

我也尝试过诸如main + 1,disas / r等操作。gdb的行为是否有所改变?我以为可能与这是一个PIE二进制文件有关,但是当我使用-no-pie重新编译它时,对于某些简单的问题我仍然遇到此问题。

正确的语法是什么?

1 个答案:

答案 0 :(得分:3)

  

它仍然在main的顶部开始拆卸。

当给disas一个参数时,它将找到封闭的函数,并反汇编 entire 函数。这是永远的行为。

如果改为给disas两个参数,则它将反汇编给定范围:

(gdb) disas &main
Dump of assembler code for function main:
   0x00000000000005fa <+0>: push   %rbp
   0x00000000000005fb <+1>: mov    %rsp,%rbp
   0x00000000000005fe <+4>: mov    $0x0,%eax
   0x0000000000000603 <+9>: pop    %rbp
   0x0000000000000604 <+10>:    retq   
End of assembler dump.

(gdb) disas &main+3,&main+11
Dump of assembler code from 0x5fd to 0x605:
   0x00000000000005fd <main+3>: in     $0xb8,%eax
   0x00000000000005ff <main+5>: add    %al,(%rax)
   0x0000000000000601 <main+7>: add    %al,(%rax)
   0x0000000000000603 <main+9>: pop    %rbp
   0x0000000000000604 <main+10>:    retq   
End of assembler dump.

您也可以使用x/i

(gdb) x/4i &main+3
   0x5fd <main+3>:  in     $0xb8,%eax
   0x5ff <main+5>:  add    %al,(%rax)
   0x601 <main+7>:  add    %al,(%rax)
   0x603 <main+9>:  pop    %rbp