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
应该可以解决问题。
我在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
应该可以解决问题。