C 带有调试信息的二进制文件的objdump会产生损坏的输出
我经常注意到,C 带有调试信息的二进制文件的objdump会产生损坏的输出,c,debugging,objdump,C,Debugging,Objdump,我经常注意到,objdump-S的输出中存在严重的汇编和C指令混合输出。这似乎只发生在使用调试信息构建的二进制文件中。有办法解决这个问题吗 为了说明这个问题,我编写了一个简单的程序: /* test.c */ #include <stdio.h> int main() { static int i = 0; while(i < 0x1000000) { i++; } retu
objdump-S
的输出中存在严重的汇编和C指令混合输出。这似乎只发生在使用调试信息构建的二进制文件中。有办法解决这个问题吗
为了说明这个问题,我编写了一个简单的程序:
/* test.c */
#include <stdio.h>
int main()
{
static int i = 0;
while(i < 0x1000000) {
i++;
}
return 0;
}
分解测试版本二进制代码可以正常工作。$objdump-S测试版本
为
main()
函数生成以下清晰简洁的代码段
080483b4 <main>:
80483b4: 55 push %ebp
80483b5: 89 e5 mov %esp,%ebp
80483b7: eb 0d jmp 80483c6 <main+0x12>
80483b9: a1 18 a0 04 08 mov 0x804a018,%eax
80483be: 83 c0 01 add $0x1,%eax
80483c1: a3 18 a0 04 08 mov %eax,0x804a018
80483c6: a1 18 a0 04 08 mov 0x804a018,%eax
80483cb: 3d ff ff ff 00 cmp $0xffffff,%eax
80483d0: 7e e7 jle 80483b9 <main+0x5>
80483d2: b8 00 00 00 00 mov $0x0,%eax
80483d7: 5d pop %ebp
80483d8: c3 ret
080483b4 <main>:
#include <stdio.h>
int main()
{
80483b4: 55 push %ebp
80483b5: 89 e5 mov %esp,%ebp
static int i = 0;
while(i < 0x1000000) {
80483b7: eb 0d jmp 80483c6 <main+0x12>
i++;
80483b9: a1 18 a0 04 08 mov 0x804a018,%eax
80483be: 83 c0 01 add $0x1,%eax
80483c1: a3 18 a0 04 08 mov %eax,0x804a018
int main()
{
static int i = 0;
while(i < 0x1000000) {
80483c6: a1 18 a0 04 08 mov 0x804a018,%eax
80483cb: 3d ff ff ff 00 cmp $0xffffff,%eax
80483d0: 7e e7 jle 80483b9 <main+0x5>
i++;
}
return 0;
80483d2: b8 00 00 00 00 mov $0x0,%eax
}
80483d7: 5d pop %ebp
80483d8: c3 ret
我确实理解,由于调试二进制文件包含额外的符号信息,C代码与汇编指令交错显示。但这使得遵循代码流有点困难
是否有任何方法可以指示objdump输出纯汇编而不是交错调试符号到输出中,即使在二进制文件中遇到
使用-d而不是-S。objdump完全按照您的指示执行。-S选项表示-d,但如果调试信息可用,还显示C源代码
080483b4 <main>:
#include <stdio.h>
int main()
{
80483b4: 55 push %ebp
80483b5: 89 e5 mov %esp,%ebp
static int i = 0;
while(i < 0x1000000) {
80483b7: eb 0d jmp 80483c6 <main+0x12>
i++;
80483b9: a1 18 a0 04 08 mov 0x804a018,%eax
80483be: 83 c0 01 add $0x1,%eax
80483c1: a3 18 a0 04 08 mov %eax,0x804a018
int main()
{
static int i = 0;
while(i < 0x1000000) {
80483c6: a1 18 a0 04 08 mov 0x804a018,%eax
80483cb: 3d ff ff ff 00 cmp $0xffffff,%eax
80483d0: 7e e7 jle 80483b9 <main+0x5>
i++;
}
return 0;
80483d2: b8 00 00 00 00 mov $0x0,%eax
}
80483d7: 5d pop %ebp
80483d8: c3 ret