2009-08-16 80 views
4

下一個平坦的二進制文件是否有執行在Linux中平坦的二值圖像的方式,使用的語法是這樣的:執行的Linux

nasm -f bin -o foo.bin foo.asm 
runbinary foo.bin 
+0

有什麼理由不能使用像elf這樣的格式(通過鏈接器)? – 2009-08-16 02:47:53

+0

我試圖讓我的代碼儘可能小。 – computergeek6 2009-08-16 03:03:05

回答

6

是有一些原因,你不希望使用「-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 
+1

我可以製作一個C程序,將一個平面二進制文件加載到它自己的代碼空間並執行它嗎? – computergeek6 2009-08-16 03:02:14

+0

我想這是可能的,但實際上,你應該只使用ELF而不用擔心幾個字節的開銷。 – 2009-08-16 03:13:59

+0

只要您的環境允許您將數據作爲代碼運行,就可以。 – 2009-08-16 03:57:33

7

Linux內核可裝載多個不同的二進制格式 - ELF只是最常見,儘管a.out格式也是衆所周知的。

支持的二進制格式由哪些binfmt模塊加載或編譯到內核(它們位於內核配置的Filesystem部分下)控制。對於uClinux BFLT平面格式二進制文件,有一個binfmt_flat,它們相當小 - 它們甚至可以是zlib壓縮的,這樣可以讓你的二進制文件變得更小,所以這可能是一個不錯的選擇。

它看起來並不像nasm本身支持這種格式,但是像Jim Lewis爲ELF描述的那樣手動添加必要的頭文件非常容易。有一個here格式的說明。