3 (define (int->bv32 value)
4 (let ((bv (make-bytevector 4)))
5 (bytevector-u32-native-set! bv 0 value)
8 (define (int->bv16 value)
9 (let ((bv (make-bytevector 2)))
10 (bytevector-u16-native-set! bv 0 value)
13 (define vaddress #x08048000)
15 (define ei-magic `(#x7f ,@(string->list "ELF")))
16 (define ei-class '(#x01)) ;; 32 bit
17 (define ei-data '(#x01)) ;; little endian
18 (define ei-version '(#x01))
19 (define ei-osabi '(#x00))
20 (define ei-pad '(#x0 #x0 #x0 #x0 #x0 #x0 #x0 #x0))
30 (define e-type '(#x02 #x00)) ;; ET_EXEC
31 (define e-machine '(#x03 #x00))
32 (define e-version '(#x01 #x00 #x00 #x00))
33 (define e-entry '(0 0 0 0))
34 (define e-phoff '(0 0 0 0))
35 (define e-shoff '(0 0 0 0))
36 (define e-flags '(#x00 #x00 #x00 #x00))
37 (define e-ehsize '(0 0))
38 (define e-phentsize '(0 0))
39 (define e-phnum '(#x01 #x00))
40 (define e-shentsize '(0 0))
41 (define e-shnum '(#x04 #x00))
42 (define e-shstrndx '(#x03 #x00))
62 (define p-type '(#x01 #x00 #x00 #x00))
63 (define p-offset '(0 0 0 0))
64 (define p-vaddr '(0 0 0 0))
65 (define p-paddr '(0 0 0 0))
66 (define p-filesz '(0 0 0 0))
67 (define p-memsz '(0 0 0 0))
68 (define p-flags '(#x07 #x00 #x00 #x00))
69 (define p-align '(#x01 #x00 #x00 #x00))
71 (define (program-header-0)
83 (set! e-phentsize (int->bv16 (length (program-header-0))))
85 (define (program-headers)
96 (define (elf-header-size)
100 (set! e-phoff (int->bv32 (elf-header-size)))
101 (set! e-ehsize (int->bv16 (elf-header-size)))
103 (define (text-offset)
106 (define data-offset #x1076)
107 (define data-address (+ data-offset vaddress))
109 (define (i386:puts data)
111 #xba #x0e #x00 #x00 #x00 ;; mov $0xe,%edx
112 #xb9 ,@(int->bv32 data) ;; mov $data,%ecx
113 #xbb #x01 #x00 #x00 #x00 ;; mov $0x1,%ebx
114 #xb8 #x04 #x00 #x00 #x00 ;; mov $0x4,%eax
115 #xcd #x80 ;; int $0x80
118 (define (i386:exit code)
120 #xbb ,@(int->bv32 code) ;; mov $code,%ebx
121 #xb8 #x01 #x00 #x00 #x00 ;; mov $0x1,%eax
122 #xcd #x80 ;; int $0x80
127 (i386:puts data-address)
132 (vector->list (make-vector (- data-offset (length text) (text-offset)) #x00)))
134 (define program-length
135 (+ (length text) (length text-free)))
136 (set! p-filesz (int->bv32 program-length))
137 (set! p-memsz (int->bv32 program-length))
141 (string->list "Hello, world!\n"))
147 #x00 ,@(string->list ".shstrtab")
148 #x00 ,@(string->list ".text")
149 #x00 ,@(string->list ".data")
153 (define sh-0-name '(#x99 #x99 #x00 #x00))
154 (define sh-0-type '(#x00 #x00 #x00 #x00))
155 (define sh-0-flags '(#x00 #x00 #x00 #x00))
156 (define sh-0-addr '(#x00 #x00 #x00 #x00))
157 (define sh-0-offset '(#x00 #x00 #x00 #x00))
158 (define sh-0-size '(#x00 #x00 #x00 #x00))
159 (define sh-0-link '(#x00 #x00 #x00 #x00))
160 (define sh-0-info '(#x00 #x00 #x00 #x00))
161 (define sh-0-addralign '(#x00 #x00 #x00 #x00))
162 (define sh-0-entsize '(#x00 #x00 #x00 #x00))
178 (set! e-shentsize (int->bv16 (length sh-0)))
181 (define sh-text-name '(#x0b #x00 #x00 #x00))
182 (define sh-text-type '(#x01 #x00 #x00 #x00))
183 (define sh-text-flags '(#x06 #x00 #x00 #x00))
184 ;;(define sh-text-addr '(#x54 #x80 #x04 #x08))
185 (define sh-text-addr (int->bv32 (+ vaddress (text-offset))))
186 (set! e-entry sh-text-addr)
187 (set! p-vaddr sh-text-addr)
188 (set! p-paddr sh-text-addr)
189 ;;(define sh-text-offset '(#x54 #x00 #x00 #x00))
190 (define sh-text-offset (int->bv32 (text-offset)))
191 (set! p-offset sh-text-offset)
192 (define sh-text-size '(#x22 #x00 #x00 #x00))
193 (define sh-text-link '(#x00 #x00 #x00 #x00))
194 (define sh-text-info '(#x00 #x00 #x00 #x00))
195 (define sh-text-addralign '(#x01 #x00 #x00 #x00))
196 (define sh-text-entsize '(#x00 #x00 #x00 #x00))
213 (define sh-data-name '(#x11 #x00 #x00 #x00))
214 (define sh-data-type '(#x01 #x00 #x00 #x00))
215 (define sh-data-flags '(#x03 #x00 #x00 #x00))
216 ;;(define sh-data-addr '(#x76 #x90 #x04 #x08))
217 (define sh-data-addr (int->bv32 data-address))
218 ;;(define sh-data-offset '(#x76 #x10 #x00 #x00))
219 (define sh-data-offset (int->bv32 data-offset))
220 ;;(define sh-data-size '(#x0e #x00 #x00 #x00))
221 (define sh-data-size (int->bv32 (length data)))
222 (define sh-data-link '(#x00 #x00 #x00 #x00))
223 (define sh-data-info '(#x00 #x00 #x00 #x00))
224 (define sh-data-addralign '(#x01 #x00 #x00 #x00))
225 (define sh-data-entsize '(#x00 #x00 #x00 #x00))
241 ;; 1158 sh4: .shstrtab
242 (define sh-tab-name '(#x01 #x00 #x00 #x00))
243 (define sh-tab-type '(#x03 #x00 #x00 #x00))
244 (define sh-tab-flags '(#x00 #x00 #x00 #x00))
245 (define sh-tab-addr '(#x00 #x00 #x00 #x00))
246 ;;(define sh-tab-offset '(#x98 #x10 #x00 #x00))
247 (define sh-tab-offset '(#x84 #x10 #x00 #x00))
248 (define sh-tab-size '(#x1d #x00 #x00 #x00))
249 (define sh-tab-link '(#x00 #x00 #x00 #x00))
250 (define sh-tab-info '(#x00 #x00 #x00 #x00))
251 (define sh-tab-addralign '(#x01 #x00 #x00 #x00))
252 (define sh-tab-entsize '(#x00 #x00 #x00 #x00))
268 (define section-headers
276 (define (section-headers-offset)
285 (set! e-shoff (int->bv32 (section-headers-offset)))
292 ;;1076 (+ 0804 8000): 0804 9076