反汇编C代码中的冗余操作

时间:2018-12-12 21:16:42

标签: c gcc assembly nasm

我有一个.c文件,其中包含以下代码:

void func(){
    char* string = "hello";
}

我使用它编译和链接

i386-elf-gcc -ffreestanding -c pointers.c -o pointers.o
i386-elf-ld -o pointers.bin -Ttext 0x0 --oformat binary pointers.o

,然后使用ndisasm -b 32 pointers.bin进行拆卸。 这样产生:

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  83EC10            sub esp,byte +0x10
00000006  C745FC0F000000    mov dword [ebp-0x4],0xf
0000000D  C9                leave
0000000E  C3                ret
0000000F  68656C6C6F        push dword 0x6f6c6c65
00000014  0000              add [eax],al
00000016  0000              add [eax],al
00000018  1400              adc al,0x0
0000001A  0000              add [eax],al
0000001C  0000              add [eax],al
0000001E  0000              add [eax],al
00000020  017A52            add [edx+0x52],edi
00000023  0001              add [ecx],al
00000025  7C08              jl 0x2f
00000027  011B              add [ebx],ebx
00000029  0C04              or al,0x4
0000002B  0488              add al,0x88
0000002D  0100              add [eax],eax
0000002F  001C00            add [eax+eax],bl
00000032  0000              add [eax],al
00000034  1C00              sbb al,0x0
00000036  0000              add [eax],al
00000038  C8FFFFFF          enter 0xffff,0xff
0000003C  0F0000            sldt [eax]
0000003F  0000              add [eax],al
00000041  41                inc ecx
00000042  0E                push cs
00000043  088502420D05      or [ebp+0x50d4202],al
00000049  4B                dec ebx
0000004A  C50C04            lds ecx,[esp+eax]
0000004D  0400              add al,0x0
0000004F  00                db 0x00

前7行清楚地对应于上面显示的c代码。但是,第7行之后所有东西的用途是什么?使用xxd检查bin不会显示可理解的文本,因此它们似乎不是注释。与我的编译器/链接器选项有关吗?

1 个答案:

答案 0 :(得分:3)

0000000F  68656C6C6F        push dword 0x6f6c6c65

68 65 6c 6c 6f是来自对象文件"hello"部分的字符串.rodata。拆卸是胡说八道。

您正在查看的其余数据是.eh_frame部分的内容。 This data is used for exception handling,尽管在这种情况下尚未使用。与.rodata部分一样,对该数据的反汇编是无意义的。

通过运行objdump -D pointers.o,可以查看这些部分的内容以及未复制到输出文件的其他一些部分。

要更好地控制二进制输出的格式,可以write a linker script