我想要遵循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
什麼是附加說明的目的,我怎麼可以從目標文件帶他們和二進制?
編輯:
- 錯字在
objcopy
ARGS(commet - >註釋)。更新了反彙編輸出。
@ IgnacioVazquez-Abrams我試圖找到關於'.comment'部分的信息,但它並沒有太多提高。這是什麼,爲什麼你認爲這是該節? – sdsmith
如果你用'objdump -x test.o'來轉儲出所有的elf標題/部分,你可能會發現你有'.eh_frame'部分。既然你不排除它佔用文件中的空間。如果你不打算使用異常處理,那麼把它添加到你的GCC命令行'-fno-exceptions -fno-asynchronous-unwind-tables'中。因此'gcc -m32 -c test.c -fno-exceptions -fno-asynchronous-unwind-tables'應該可能解決你的問題。 –
它們實際上不是指令,它們是異常幀數據,它們在轉換爲二進制平面文件時直接放在代碼後面。 「ndisasm」碰巧正在將數據解碼爲指令,因爲它不知道差異。 –