如何在 Linux 中反汇编二进制可执行文件以获取汇编代码?

新手上路,请多包涵

有人告诉我使用反汇编程序。 gcc 有什么内置的吗?最简单的方法是什么?

原文由 Syntax_Error 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 979
2 个回答

我不认为 gcc 有它的标志,因为它主要是一个编译器,但另一个 GNU 开发工具有。 objdump 采用 -d / --disassemble 标志:

 $ objdump -d /path/to/binary

反汇编如下所示:

 080483b4 <main>:
 80483b4:   8d 4c 24 04             lea    0x4(%esp),%ecx
 80483b8:   83 e4 f0                and    $0xfffffff0,%esp
 80483bb:   ff 71 fc                pushl  -0x4(%ecx)
 80483be:   55                      push   %ebp
 80483bf:   89 e5                   mov    %esp,%ebp
 80483c1:   51                      push   %ecx
 80483c2:   b8 00 00 00 00          mov    $0x0,%eax
 80483c7:   59                      pop    %ecx
 80483c8:   5d                      pop    %ebp
 80483c9:   8d 61 fc                lea    -0x4(%ecx),%esp
 80483cc:   c3                      ret
 80483cd:   90                      nop
 80483ce:   90                      nop
 80483cf:   90                      nop

原文由 Michael Mrozek 发布,翻译遵循 CC BY-SA 2.5 许可协议

假设您有:

 #include <iostream>

double foo(double x)
{
  asm("# MyTag BEGIN"); // <- asm comment,
                        //    used later to locate piece of code
  double y = 2 * x + 1;

  asm("# MyTag END");

  return y;
}

int main()
{
  std::cout << foo(2);
}

要使用 gcc 获取汇编代码,您可以执行以下操作:

  g++ prog.cpp -c -S -o - -masm=intel | c++filt | grep -vE '\s+\.'

c++filt 符号

grep -vE '\s+\.' 去掉一些无用的信息

现在,如果您想可视化标记部分,只需使用:

 g++ prog.cpp -c -S -o - -masm=intel | c++filt | grep -vE '\s+\.' | grep "MyTag BEGIN" -A 20

用我的电脑,我得到:

     # MyTag BEGIN
# 0 "" 2
#NO_APP
    movsd   xmm0, QWORD PTR -24[rbp]
    movapd  xmm1, xmm0
    addsd   xmm1, xmm0
    addsd   xmm0, xmm1
    movsd   QWORD PTR -8[rbp], xmm0
#APP
# 9 "poub.cpp" 1
    # MyTag END
# 0 "" 2
#NO_APP
    movsd   xmm0, QWORD PTR -8[rbp]
    pop rbp
    ret
.LFE1814:
main:
.LFB1815:
    push    rbp
    mov rbp, rsp


更友好的方法是使用: Compiler Explorer

原文由 Picaud Vincent 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题