【发布时间】:2017-01-20 05:41:56
【问题描述】:
我正在尝试按照 this 教程创建二进制文件,但链接器似乎在程序集末尾附加了额外的指令。我认为这是操作系统的拆卸过程。
本教程尝试在 Linux 上编译一个简单的 32 位 C 程序:
int main() {
}
使用这些命令:
gcc -c test.c
ld -o test -Ttext 0x0 -e main test.o
objcopy -R .note -R .comment -S -O binary test test.bin
ndisasm -b 32 test.bin
我运行的是 64 位 Linux,因此修改了编译步骤如下:
gcc -m32 -c test.c
ld -m elf_i386 -o test -Ttext 0x0 -e main test.o
objcopy -R .note -R .comment -S -O binary test test.bin
ndisasm -b 32 test.bin
预期的输出是:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 C9 leave
00000004 C3 ret
我的输出如下:
;; START expected output
00000000 55 push bp
00000001 89E5 mov bp,sp
00000003 5D pop bp
00000004 C3 ret
;; END expected output
00000005 0000 add [eax],al
00000007 001400 add [eax+eax],dl
0000000A 0000 add [eax],al
0000000C 0000 add [eax],al
0000000E 0000 add [eax],al
00000010 017A52 add [edx+0x52],edi
00000013 0001 add [ecx],al
00000015 7C08 jl 0x1f
00000017 011B add [ebx],ebx
00000019 0C04 or al,0x4
0000001B 0488 add al,0x88
0000001D 0100 add [eax],eax
0000001F 001C00 add [eax+eax],bl
00000022 0000 add [eax],al
00000024 1C00 sbb al,0x0
00000026 0000 add [eax],al
00000028 D8FF fdivr st7
0000002A FF db 0xff
0000002B FF0500000000 inc dword [dword 0x0]
00000031 41 inc ecx
00000032 0E push cs
00000033 088502420D05 or [ebp+0x50d4202],al
00000039 41 inc ecx
0000003A C50C04 lds ecx,[esp+eax]
0000003D 0400 add al,0x0
0000003F 00 db 0x00
附加指令的目的是什么,如何从目标文件和二进制文件中删除它们?
编辑:
-
objcopyargs 中的错字(commet -> 评论)。更新了反汇编输出。
【问题讨论】:
-
@IgnacioVazquez-Abrams 我正在尝试查找有关
.comment部分的信息,但发现的并不多。它是什么,为什么你认为它是那个部分? -
如果您使用
objdump -x test.o来转储所有精灵标题/部分,您可能会发现您有一个.eh_frame部分。由于您不排除它会占用文件中的空间。如果您不打算使用异常处理,请将其添加到您的 GCC 命令行-fno-exceptions -fno-asynchronous-unwind-tables。所以gcc -m32 -c test.c -fno-exceptions -fno-asynchronous-unwind-tables应该可以解决你的问题。 -
它们实际上不是指令,它们是异常帧数据,在转换为二进制平面文件时直接放在代码之后。
ndisasm恰好将数据解码为指令,因为它不知道其中的区别。 -
@MichaelPetch 谢谢,它成功了。您想让您的评论成为答案吗?