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

标签 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 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/

相关文章:

c++ - 尽管使用了 C++14 功能,为什么使用 C++11 编译成功?

c - 如何使用在堆上实现的堆栈将程序集转换为 C?

c - dll 的 dumpbin 输出中的 "virtual address"

c - 在 C 中使用编写的跳转表或 switch 语句是否更快?

c++ - gcc -O0 与 -Og 编译时间

c - execve 不接受环境参数

c - 等待输入 1 秒,否则继续

c - SPARC 汇编问题

c - 在 C 中的 opengl 中绘制纹理

c - Winapi AppendMenu LPCTSTR 可变符号