objdump 不显示机器代码,但显示 asm

objdump do not show machine code, but show asm

我在main.cpp中有一个简单的cpp程序:

int factorial(int n) {
  int result = 1;
  for (int i = 1; i <= n; ++i) {
    result *= i;
  }
  return result;
}

int main() {
  factorial(10);
}

可以从中得到一个目标文件 (main.o):

g++ -c -g main.cpp

然后可以 运行 在此 main.o 上进行 objdump 以查看汇编代码和机器代码以及源代码:

objdump -S -M intel main.o | less

看起来像这样:

0000000000000000 <_Z9factoriali>:
int factorial(int n) {
   0:   55                      push   rbp
   1:   48 89 e5                mov    rbp,rsp
   4:   89 7d ec                mov    DWORD PTR [rbp-0x14],edi
  int result = 1;
   7:   c7 45 fc 01 00 00 00    mov    DWORD PTR [rbp-0x4],0x1
  for (int i = 1; i <= n; ++i) {
   e:   c7 45 f8 01 00 00 00    mov    DWORD PTR [rbp-0x8],0x1
  15:   8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
  18:   3b 45 ec                cmp    eax,DWORD PTR [rbp-0x14]
  1b:   7f 0f                   jg     2c <_Z9factoriali+0x2c>
    result *= i;
  1d:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
  20:   0f af 45 f8             imul   eax,DWORD PTR [rbp-0x8]
  24:   89 45 fc                mov    DWORD PTR [rbp-0x4],eax
  for (int i = 1; i <= n; ++i) {
  27:   ff 45 f8                inc    DWORD PTR [rbp-0x8]
  2a:   eb e9                   jmp    15 <_Z9factoriali+0x15>
  }
  return result;
  2c:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
}
  2f:   5d                      pop    rbp
  30:   c3                      ret 

我是否可以得到这样的输出:(abbr)

0000000000000000 <_Z9factoriali>:
int factorial(int n) {
   push   rbp                   
   mov    rbp,rsp               
   mov    DWORD PTR [rbp-0x14],edi
  int result = 1;
   mov    DWORD PTR [rbp-0x4],0x1
  for (int i = 1; i <= n; ++i) {
   mov    DWORD PTR [rbp-0x8],0x1
   mov    eax,DWORD PTR [rbp-0x8]
   cmp    eax,DWORD PTR [rbp-0x14]
   jg     2c <_Z9factoriali+0x2c>
  result *= i;
   mov    eax,DWORD PTR [rbp-0x4]
   imul   eax,DWORD PTR [rbp-0x8]
   mov    DWORD PTR [rbp-0x4],eax
  for (int i = 1; i <= n; ++i) {
   inc    DWORD PTR [rbp-0x8]
   jmp    15 <_Z9factoriali+0x15>
  }
  return result;
   mov    eax,DWORD PTR [rbp-0x4]
}
  pop    rbp                    
  ret  

即没有机器代码。我查看了手册页,找不到这样的选项。

有没有其他工具可以显示与源代码混合的程序集?我知道像 visual studio 这样的许多 IDE 都内置了这个功能。

顺便说一句,一种方法是使用 gdb 然后调用 disassemble /m func_name 并生成我需要的内容,但是启动 gdb 和 运行 该命令的工作量太大。

来自 objdump 的联机帮助页,

--no-show-raw-insn When disassembling instructions, do not print the instruction bytes. This is the default when --prefix-addresses is used.

所以,objdump -S -M intel --no-show-raw-insn main.o | less 应该可以解决问题。