elf.mes: softcode more.
This commit is contained in:
parent
ec8553dc4f
commit
98d4772e3f
146
elf.mes
146
elf.mes
|
@ -10,8 +10,9 @@
|
||||||
(bytevector-u16-native-set! bv 0 value)
|
(bytevector-u16-native-set! bv 0 value)
|
||||||
bv))
|
bv))
|
||||||
|
|
||||||
(define ei-magic '(#x7f #\E #\L #\F))
|
(define vaddress #x08048000)
|
||||||
;;(define ei-magic '(#x7f #x45 #x4c #x46))
|
|
||||||
|
(define ei-magic `(#x7f ,@(string->list "ELF")))
|
||||||
(define ei-class '(#x01)) ;; 32 bit
|
(define ei-class '(#x01)) ;; 32 bit
|
||||||
(define ei-data '(#x01)) ;; little endian
|
(define ei-data '(#x01)) ;; little endian
|
||||||
(define ei-version '(#x01))
|
(define ei-version '(#x01))
|
||||||
|
@ -29,18 +30,18 @@
|
||||||
(define e-type '(#x02 #x00)) ;; ET_EXEC
|
(define e-type '(#x02 #x00)) ;; ET_EXEC
|
||||||
(define e-machine '(#x03 #x00))
|
(define e-machine '(#x03 #x00))
|
||||||
(define e-version '(#x01 #x00 #x00 #x00))
|
(define e-version '(#x01 #x00 #x00 #x00))
|
||||||
(define e-entry '(#x54 #x80 #x04 #x08))
|
(define e-entry '(0 0 0 0))
|
||||||
(define e-phoff '(#x34 #x00 #x00 #x00))
|
(define e-phoff '(0 0 0 0))
|
||||||
(define e-shoff '(#xb8 #x10 #x00 #x00))
|
(define e-shoff '(0 0 0 0))
|
||||||
(define e-flags '(#x00 #x00 #x00 #x00))
|
(define e-flags '(#x00 #x00 #x00 #x00))
|
||||||
(define e-ehsize '(#x34 #x00))
|
(define e-ehsize '(0 0))
|
||||||
(define e-phentsize '(#x20 #x00))
|
(define e-phentsize '(0 0))
|
||||||
(define e-phnum '(#x01 #x00))
|
(define e-phnum '(#x01 #x00))
|
||||||
(define e-shentsize '(#x28 #x00))
|
(define e-shentsize '(0 0))
|
||||||
(define e-shnum '(#x05 #x00))
|
(define e-shnum '(#x05 #x00))
|
||||||
(define e-shstrndx '(#x04 #x00))
|
(define e-shstrndx '(#x04 #x00))
|
||||||
|
|
||||||
(define elf-header
|
(define (elf-header)
|
||||||
(append
|
(append
|
||||||
e-ident
|
e-ident
|
||||||
e-type
|
e-type
|
||||||
|
@ -58,21 +59,16 @@
|
||||||
e-shstrndx
|
e-shstrndx
|
||||||
))
|
))
|
||||||
|
|
||||||
;; 34
|
|
||||||
(define p-type '(#x01 #x00 #x00 #x00))
|
(define p-type '(#x01 #x00 #x00 #x00))
|
||||||
(define p-offset '(#x54 #x00 #x00 #x00))
|
(define p-offset '(0 0 0 0))
|
||||||
(define p-vaddr '(#x54 #x80 #x04 #x08))
|
(define p-vaddr '(0 0 0 0))
|
||||||
|
(define p-paddr '(0 0 0 0))
|
||||||
;; 40
|
(define p-filesz '(0 0 0 0))
|
||||||
(define p-paddr '(#x54 #x80 #x04 #x08))
|
(define p-memsz '(0 0 0 0))
|
||||||
(define p-filesz '(#x10 #x30 #x00 #x00))
|
|
||||||
(define p-memsz '(#x10 #x30 #x00 #x00))
|
|
||||||
(define p-flags '(#x07 #x00 #x00 #x00))
|
(define p-flags '(#x07 #x00 #x00 #x00))
|
||||||
|
|
||||||
;; 50
|
|
||||||
(define p-align '(#x01 #x00 #x00 #x00))
|
(define p-align '(#x01 #x00 #x00 #x00))
|
||||||
|
|
||||||
(define program-header-0
|
(define (program-header-0)
|
||||||
(append
|
(append
|
||||||
p-type
|
p-type
|
||||||
p-offset
|
p-offset
|
||||||
|
@ -84,45 +80,65 @@
|
||||||
p-align
|
p-align
|
||||||
))
|
))
|
||||||
|
|
||||||
(define program-headers
|
(set! e-phentsize (int->bv16 (length (program-header-0))))
|
||||||
|
|
||||||
|
(define (program-headers)
|
||||||
(append
|
(append
|
||||||
program-header-0
|
(program-header-0)
|
||||||
))
|
))
|
||||||
|
|
||||||
(define headers
|
(define (headers)
|
||||||
(append
|
(append
|
||||||
elf-header
|
(elf-header)
|
||||||
program-headers
|
(program-headers)
|
||||||
))
|
))
|
||||||
|
|
||||||
;;(define text-offset #x54)
|
(define (elf-header-size)
|
||||||
(define text-offset
|
(length
|
||||||
(length headers))
|
(elf-header)))
|
||||||
|
|
||||||
|
(set! e-phoff (int->bv32 (elf-header-size)))
|
||||||
|
(set! e-ehsize (int->bv16 (elf-header-size)))
|
||||||
|
|
||||||
|
(define (text-offset)
|
||||||
|
(length (headers)))
|
||||||
|
|
||||||
(define data-offset #x1076)
|
(define data-offset #x1076)
|
||||||
|
(define data-address (+ data-offset vaddress))
|
||||||
|
|
||||||
;;0054 (+ 0804 8000): 0804 8054
|
(define (i386:puts data)
|
||||||
(define text
|
`(
|
||||||
'(
|
|
||||||
#xba #x0e #x00 #x00 #x00 ;; mov $0xe,%edx
|
#xba #x0e #x00 #x00 #x00 ;; mov $0xe,%edx
|
||||||
#xb9 #x76 #x90 #x04 #x08 ;; mov $0x8049076,%ecx
|
#xb9 ,@(int->bv32 data) ;; mov $data,%ecx
|
||||||
#xbb #x01 #x00 #x00 #x00 ;; mov $0x1,%ebx
|
#xbb #x01 #x00 #x00 #x00 ;; mov $0x1,%ebx
|
||||||
#xb8 #x04 #x00 #x00 #x00 ;; mov $0x4,%eax
|
#xb8 #x04 #x00 #x00 #x00 ;; mov $0x4,%eax
|
||||||
#xcd #x80 ;; int $0x80
|
#xcd #x80 ;; int $0x80
|
||||||
#xbb #x00 #x00 #x00 #x00 ;; mov $0x0,%ebx
|
))
|
||||||
|
|
||||||
|
(define (i386:exit code)
|
||||||
|
`(
|
||||||
|
#xbb ,@(int->bv32 code) ;; mov $code,%ebx
|
||||||
#xb8 #x01 #x00 #x00 #x00 ;; mov $0x1,%eax
|
#xb8 #x01 #x00 #x00 #x00 ;; mov $0x1,%eax
|
||||||
#xcd #x80 ;; int $0x80
|
#xcd #x80 ;; int $0x80
|
||||||
))
|
))
|
||||||
|
|
||||||
|
(define text
|
||||||
|
(append
|
||||||
|
(i386:puts data-address)
|
||||||
|
(i386:exit 0)
|
||||||
|
))
|
||||||
|
|
||||||
(define text-free
|
(define text-free
|
||||||
(vector->list (make-vector (- data-offset (length text) text-offset) #x00)))
|
(vector->list (make-vector (- data-offset (length text) (text-offset)) #x00)))
|
||||||
|
|
||||||
|
(define program-length
|
||||||
|
(+ (length text) (length text-free)))
|
||||||
|
(set! p-filesz (int->bv32 program-length))
|
||||||
|
(set! p-memsz (int->bv32 program-length))
|
||||||
|
|
||||||
;; 1076
|
;; 1076
|
||||||
(define data
|
(define data
|
||||||
'(
|
(string->list "Hello, world!\n"))
|
||||||
#\H #\e #\l #\l #\o #\, #\space #\w #\o #\r
|
|
||||||
#\l #\d #\! #\newline
|
|
||||||
))
|
|
||||||
|
|
||||||
(define note
|
(define note
|
||||||
'(
|
'(
|
||||||
|
@ -132,14 +148,14 @@
|
||||||
|
|
||||||
;; 1098 sh str table
|
;; 1098 sh str table
|
||||||
(define tab
|
(define tab
|
||||||
'(
|
`(
|
||||||
#x00 #\. #\s #\h #\s #\t #\r #\t
|
#x00 ,@(string->list ".shstrtab")
|
||||||
|
#x00 ,@(string->list ".text")
|
||||||
#\a #\b #x00 #\. #\t #\e #\x #\t #x00 #\. #\d #\a #\t #\a #x00 #\.
|
#x00 ,@(string->list ".data")
|
||||||
#\n #\o #\t #\e #x00 #x00 #x00 #x00
|
#x00 ,@(string->list ".note")
|
||||||
|
#x00 #x00 #x00 #x00
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
||||||
(define sh-0-name '(#x99 #x99 #x00 #x00))
|
(define sh-0-name '(#x99 #x99 #x00 #x00))
|
||||||
(define sh-0-type '(#x00 #x00 #x00 #x00))
|
(define sh-0-type '(#x00 #x00 #x00 #x00))
|
||||||
(define sh-0-flags '(#x00 #x00 #x00 #x00))
|
(define sh-0-flags '(#x00 #x00 #x00 #x00))
|
||||||
|
@ -165,12 +181,20 @@
|
||||||
sh-0-entsize
|
sh-0-entsize
|
||||||
))
|
))
|
||||||
|
|
||||||
|
(set! e-shentsize (int->bv16 (length sh-0)))
|
||||||
|
|
||||||
;; 10e0 sh1: .text
|
;; 10e0 sh1: .text
|
||||||
(define sh-text-name '(#x0b #x00 #x00 #x00))
|
(define sh-text-name '(#x0b #x00 #x00 #x00))
|
||||||
(define sh-text-type '(#x01 #x00 #x00 #x00))
|
(define sh-text-type '(#x01 #x00 #x00 #x00))
|
||||||
(define sh-text-flags '(#x06 #x00 #x00 #x00))
|
(define sh-text-flags '(#x06 #x00 #x00 #x00))
|
||||||
(define sh-text-addr '(#x54 #x80 #x04 #x08))
|
;;(define sh-text-addr '(#x54 #x80 #x04 #x08))
|
||||||
|
(define sh-text-addr (int->bv32 (+ vaddress (text-offset))))
|
||||||
|
(set! e-entry sh-text-addr)
|
||||||
|
(set! p-vaddr sh-text-addr)
|
||||||
|
(set! p-paddr sh-text-addr)
|
||||||
;;(define sh-text-offset '(#x54 #x00 #x00 #x00))
|
;;(define sh-text-offset '(#x54 #x00 #x00 #x00))
|
||||||
|
(define sh-text-offset (int->bv32 (text-offset)))
|
||||||
|
(set! p-offset sh-text-offset)
|
||||||
(define sh-text-size '(#x22 #x00 #x00 #x00))
|
(define sh-text-size '(#x22 #x00 #x00 #x00))
|
||||||
(define sh-text-link '(#x00 #x00 #x00 #x00))
|
(define sh-text-link '(#x00 #x00 #x00 #x00))
|
||||||
(define sh-text-info '(#x00 #x00 #x00 #x00))
|
(define sh-text-info '(#x00 #x00 #x00 #x00))
|
||||||
|
@ -183,8 +207,7 @@
|
||||||
sh-text-type
|
sh-text-type
|
||||||
sh-text-flags
|
sh-text-flags
|
||||||
sh-text-addr
|
sh-text-addr
|
||||||
;;sh-text-offset
|
sh-text-offset
|
||||||
(int->bv32 text-offset)
|
|
||||||
sh-text-size
|
sh-text-size
|
||||||
sh-text-link
|
sh-text-link
|
||||||
sh-text-info
|
sh-text-info
|
||||||
|
@ -196,10 +219,12 @@
|
||||||
(define sh-data-name '(#x11 #x00 #x00 #x00))
|
(define sh-data-name '(#x11 #x00 #x00 #x00))
|
||||||
(define sh-data-type '(#x01 #x00 #x00 #x00))
|
(define sh-data-type '(#x01 #x00 #x00 #x00))
|
||||||
(define sh-data-flags '(#x03 #x00 #x00 #x00))
|
(define sh-data-flags '(#x03 #x00 #x00 #x00))
|
||||||
(define sh-data-addr '(#x76 #x90 #x04 #x08))
|
;;(define sh-data-addr '(#x76 #x90 #x04 #x08))
|
||||||
|
(define sh-data-addr (int->bv32 data-address))
|
||||||
;;(define sh-data-offset '(#x76 #x10 #x00 #x00))
|
;;(define sh-data-offset '(#x76 #x10 #x00 #x00))
|
||||||
(define sh-data-offset '(#x76 #x10 #x00 #x00))
|
(define sh-data-offset (int->bv32 data-offset))
|
||||||
(define sh-data-size '(#x0e #x00 #x00 #x00))
|
;;(define sh-data-size '(#x0e #x00 #x00 #x00))
|
||||||
|
(define sh-data-size (int->bv32 (length data)))
|
||||||
(define sh-data-link '(#x00 #x00 #x00 #x00))
|
(define sh-data-link '(#x00 #x00 #x00 #x00))
|
||||||
(define sh-data-info '(#x00 #x00 #x00 #x00))
|
(define sh-data-info '(#x00 #x00 #x00 #x00))
|
||||||
(define sh-data-addralign '(#x01 #x00 #x00 #x00))
|
(define sh-data-addralign '(#x01 #x00 #x00 #x00))
|
||||||
|
@ -211,10 +236,8 @@
|
||||||
sh-data-type
|
sh-data-type
|
||||||
sh-data-flags
|
sh-data-flags
|
||||||
sh-data-addr
|
sh-data-addr
|
||||||
;;sh-data-offset
|
sh-data-offset
|
||||||
(int->bv32 data-offset)
|
sh-data-size
|
||||||
;;sh-data-size
|
|
||||||
(int->bv32 (length data))
|
|
||||||
sh-data-link
|
sh-data-link
|
||||||
sh-data-info
|
sh-data-info
|
||||||
sh-data-addralign
|
sh-data-addralign
|
||||||
|
@ -282,10 +305,21 @@
|
||||||
sh-tab
|
sh-tab
|
||||||
))
|
))
|
||||||
|
|
||||||
|
(define (section-headers-offset)
|
||||||
|
(length
|
||||||
|
(append
|
||||||
|
(headers)
|
||||||
|
text
|
||||||
|
text-free
|
||||||
|
data
|
||||||
|
note
|
||||||
|
tab)))
|
||||||
|
|
||||||
|
(set! e-shoff (int->bv32 (section-headers-offset)))
|
||||||
|
|
||||||
(define exe
|
(define exe
|
||||||
(append
|
(append
|
||||||
elf-header
|
(headers)
|
||||||
program-headers
|
|
||||||
text
|
text
|
||||||
text-free
|
text-free
|
||||||
;;1076 (+ 0804 8000): 0804 9076
|
;;1076 (+ 0804 8000): 0804 9076
|
||||||
|
|
Loading…
Reference in a new issue