我有一个包含以下代码的 .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 32pointers.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 不会显示可理解的文本,因此它们似乎不是注释。它与我的编译器/链接器选项有关吗?
最佳答案
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 .
关于c - 反汇编c代码中的冗余操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53751478/