下一個平坦的二進制文件是否有執行在Linux中平坦的二值圖像的方式,使用的語法是這樣的:執行的Linux
nasm -f bin -o foo.bin foo.asm
runbinary foo.bin
下一個平坦的二進制文件是否有執行在Linux中平坦的二值圖像的方式,使用的語法是這樣的:執行的Linux
nasm -f bin -o foo.bin foo.asm
runbinary foo.bin
是有一些原因,你不希望使用「-f精靈「而不是」-f bin「?
我認爲Linux不會運行不是ELF格式的二進制文件。我無法找到一個工具,轉換扁平二進制文件的ELF,但你可以通過把在foo.asm的ELF信息, 利用技術騙描述here:
我們可以看看ELF 規範,和 /usr/include/linux/elf.h和 由標準 工具創建的可執行文件,以找出我們的空的 ELF可執行文件應該是什麼樣子。但是, 如果你不耐煩的類型,你可以 只使用一個我在這裏提供:
BITS 32 org 0x08048000 ehdr: ; Elf32_Ehdr db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident times 8 db 0 dw 2 ; e_type dw 3 ; e_machine dd 1 ; e_version dd _start ; e_entry dd phdr - $$ ; e_phoff dd 0 ; e_shoff dd 0 ; e_flags dw ehdrsize ; e_ehsize dw phdrsize ; e_phentsize dw 1 ; e_phnum dw 0 ; e_shentsize dw 0 ; e_shnum dw 0 ; e_shstrndx ehdrsize equ $ - ehdr phdr: ; Elf32_Phdr dd 1 ; p_type dd 0 ; p_offset dd $$ ; p_vaddr dd $$ ; p_paddr dd filesize ; p_filesz dd filesize ; p_memsz dd 5 ; p_flags dd 0x1000 ; p_align phdrsize equ $ - phdr _start: ; your program here filesize equ $ - $$
該映像包含一個ELF頭, 識別文件作爲英特爾386 可執行文件,而且沒有節標題 表和節目標題表 包含一個條目。所述條目 指示程序加載器加載 整個文件到存儲器(它是 正常行爲的程序以 包括在其存儲器中的圖像其ELF頭和程序 頭表) 起始於存儲器地址0x08048000 (這是默認地址爲 可執行文件加載),並開始 執行代碼_start,其中 緊接在程序 頭表後顯示。沒有.data段,沒有 .bss段,沒有評論 - 沒有 ,但只有必需品。
所以,讓我們在我們的小軟件添加:
; tiny.asm org 0x08048000 ; ; (as above) ; _start: mov bl, 42 xor eax, eax inc eax int 0x80 filesize equ $ - $$
,並嘗試一下:
$ nasm -f bin -o a.out tiny.asm $ chmod +x a.out $ ./a.out ; echo $? 42
我可以製作一個C程序,將一個平面二進制文件加載到它自己的代碼空間並執行它嗎? – computergeek6 2009-08-16 03:02:14
我想這是可能的,但實際上,你應該只使用ELF而不用擔心幾個字節的開銷。 – 2009-08-16 03:13:59
只要您的環境允許您將數據作爲代碼運行,就可以。 – 2009-08-16 03:57:33
Linux內核可裝載多個不同的二進制格式 - ELF只是最常見,儘管a.out格式也是衆所周知的。
支持的二進制格式由哪些binfmt模塊加載或編譯到內核(它們位於內核配置的Filesystem部分下)控制。對於uClinux BFLT平面格式二進制文件,有一個binfmt_flat
,它們相當小 - 它們甚至可以是zlib壓縮的,這樣可以讓你的二進制文件變得更小,所以這可能是一個不錯的選擇。
它看起來並不像nasm本身支持這種格式,但是像Jim Lewis爲ELF描述的那樣手動添加必要的頭文件非常容易。有一個here格式的說明。
有什麼理由不能使用像elf這樣的格式(通過鏈接器)? – 2009-08-16 02:47:53
我試圖讓我的代碼儘可能小。 – computergeek6 2009-08-16 03:03:05