Chinaunix

标题: 让gdb像objdump一样反汇编,显示对应的机器码列,该如何做? [打印本页]

作者: qtdszws    时间: 2010-03-22 21:21
标题: 让gdb像objdump一样反汇编,显示对应的机器码列,该如何做?
如题
作者: liying_gg    时间: 2010-03-22 21:28
disassemble
作者: qtdszws    时间: 2010-03-22 21:32
objdump的输出

  1. 0000000000401be0 <_init>:
  2.   401be0:       48 83 ec 08             sub    $0x8,%rsp
  3.   401be4:       e8 03 06 00 00          callq  4021ec <call_gmon_start>
  4.   401be9:       e8 62 06 00 00          callq  402250 <frame_dummy>
  5.   401bee:       e8 bd ca 0a 00          callq  4ae6b0 <__do_global_ctors_aux>
  6.   401bf3:       48 83 c4 08             add    $0x8,%rsp
  7.   401bf7:       c3                      retq   
复制代码
gdb的输出

  1. (gdb) disassemble _init
  2. Dump of assembler code for function _init:
  3. 0x0000000000401be0 <_init+0>:   sub    $0x8,%rsp
  4. 0x0000000000401be4 <_init+4>:   callq  0x4021ec <call_gmon_start>
  5. 0x0000000000401be9 <_init+9>:   callq  0x402250 <frame_dummy>
  6. 0x0000000000401bee <_init+14>:  callq  0x4ae6b0 <__do_global_ctors_aux>
  7. 0x0000000000401bf3 <_init+19>:  add    $0x8,%rsp
  8. 0x0000000000401bf7 <_init+23>:  retq   
  9. End of assembler dump.
复制代码
没有机器码
作者: qtdszws    时间: 2010-03-22 21:53
本帖最后由 qtdszws 于 2010-03-22 21:56 编辑

刚才查了一下,知道了
用disassemble /r 命令
这个最新的gdb7.0支持,以前的好像不行
作者: emmoblin    时间: 2010-03-22 23:07
disassemble
显示出机器码干什么用?
作者: qtdszws    时间: 2010-03-23 09:05
disassemble有时回出问题,显示出来有一定的参考作用
作者: nine8    时间: 2010-03-23 15:23
请问下楼主 gdb如何学习?参考哪些资料学习比较好/。
作者: qtdszws    时间: 2010-03-23 15:39
我是在baidu上找一些入门资料看的,先把基本的命令掌握,然后在实际的调试中碰到问题时再去查。

我想如果有那么一本gdb参考书几百页,你从头到尾看一遍,也不一定能记住多少。

还是用多少,学多少。

有可能的话,可以看看gdb的源码,这样理解更深刻。

说了这么多,我其实也是才入门的。
作者: 帅绝人寰    时间: 2010-04-07 11:37
允许我吹牛一句哈,/r这个功能是我强烈要求严正抗议郑重建言, 才有人写的。。。gdb这么多年来一直用x命令看opcode,土死了。
作者: jzhang918    时间: 2010-04-10 23:43
回复 9# 帅绝人寰


    你的面子很大啊。加/r的那个patch是由两个redhat的大牛,一个google大牛,一个ibm大牛,一个cs大牛写的。
作者: vfdff    时间: 2010-10-27 00:47
(gdb) disas  /r exit1
Dump of assembler code for function exit1(int):
0x08048860 <exit1(int)+0>:         e9 bc ff ff ff        jmp    0x8048821 <exit_stub(int)>
0x08048865 <exit1(int)+5>:         18 c7        sbb    %al,%bh
0x08048867 <exit1(int)+7>:         04 24        add    $0x24,%al
0x08048869 <exit1(int)+9>:         fe 8a 04 08 e8 ae        decb   -0x5117f7fc(%edx)
0x0804886f <exit1(int)+15>:         fb        sti   
0x08048870 <exit1(int)+16>:         ff        (bad)  
0x08048871 <exit1(int)+17>:         ff c9        dec    %ecx
0x08048873 <exit1(int)+19>:         c3        ret   
End of assembler dump.
(gdb)

确实可以,只是显示的汇编代码格式有点乱,不如objdump好看
作者: erazy0    时间: 2010-12-05 21:00
学习了
作者: teawater_cu    时间: 2010-12-06 23:56
/r 的PATCH不是我写的么?
作者: yjf_victor    时间: 2012-03-24 23:24
本帖最后由 yjf_victor 于 2012-03-24 23:26 编辑

键入“disassemble  函数名”即可看到函数的反汇编,如果要与机器语言对应,就用“disassemble  /r  函数名”。

还有,那个gdb反汇编的的汇编代码默认的是AT&T汇编。如果不习惯,可以键入“set disassembly-flavor intel”,就能显示为Intel汇编。如果又想回到AT&T汇编,那么可以键入“set disassembly-flavor att”,设置为AT&T汇编。
作者: yjf_victor    时间: 2012-03-24 23:41
机器语言对照AT&T汇编


机器语言对照Intel汇编

作者: 帅绝人寰    时间: 2012-04-01 11:52
teawater_cu 发表于 2010-12-06 23:56
/r 的PATCH不是我写的么?



    你是──"两个redhat的大牛,一个google大牛,一个ibm大牛,一个cs大牛"啊
作者: deposit    时间: 2012-08-18 17:55
/r 这个选项应该很容易实现的,因为disassemble是通过bfd来实现对二进制文件读取的,能把汇编输出,那他肯定是知道对应的二进制文件内容的




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2