我有一个.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不会显示可理解的文本,因此它们似乎不是注释。与我的编译器/链接器选项有关吗?
答案 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。