gpt4 book ai didi

c - 反汇编c代码中的冗余操作

转载 作者:行者123 更新时间:2023-11-30 18:34:00 24 4
gpt4 key购买 nike

我有一个包含以下代码的 .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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com