75f936448a865ce99422b3dee5c5d4e5bc311966
[mes.git] / elf.mes
1 ;;; -*-scheme-*-
2
3 (define (int->bv32 value)
4   (let ((bv (make-bytevector 4)))
5     (bytevector-u32-native-set! bv 0 value)
6     bv))
7
8 (define (int->bv16 value)
9   (let ((bv (make-bytevector 2)))
10     (bytevector-u16-native-set! bv 0 value)
11     bv))
12
13 (define vaddress #x08048000)
14
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))
21 (define e-ident
22   (append
23    ei-magic
24    ei-class
25    ei-data
26    ei-version
27    ei-osabi
28    ei-pad))
29
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))
43
44 (define (elf-header)
45   (append
46    e-ident
47    e-type
48    e-machine
49    e-version
50    e-entry
51    e-phoff
52    e-shoff
53    e-flags
54    e-ehsize
55    e-phentsize
56    e-phnum
57    e-shentsize
58    e-shnum
59    e-shstrndx
60    ))
61
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))
70
71 (define (program-header-0)
72   (append
73    p-type
74    p-offset
75    p-vaddr
76    p-paddr
77    p-filesz
78    p-memsz
79    p-flags
80    p-align
81    ))
82
83 (set! e-phentsize (int->bv16 (length (program-header-0))))
84
85 (define (program-headers)
86   (append
87    (program-header-0)
88    ))
89
90 (define (headers)
91   (append
92    (elf-header)
93    (program-headers)
94    ))
95
96 (define (elf-header-size)
97   (length
98    (elf-header)))
99
100 (set! e-phoff (int->bv32 (elf-header-size)))
101 (set! e-ehsize (int->bv16 (elf-header-size)))
102
103 (define (text-offset)
104   (length (headers)))
105
106 (define data-offset #x1076)
107 (define data-address (+ data-offset vaddress))
108
109 (define (i386:puts data)
110   `(
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
116   ))
117
118 (define (i386:exit code)
119   `(
120     #xbb ,@(int->bv32 code)        ;; mov    $code,%ebx
121     #xb8 #x01 #x00 #x00 #x00       ;; mov    $0x1,%eax
122     #xcd #x80                      ;; int    $0x80
123     ))
124
125 (define text
126   (append
127    (i386:puts data-address)
128    (i386:exit 0)
129    ))
130
131 (define text-free
132   (vector->list (make-vector (- data-offset (length text) (text-offset)) #x00)))
133
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))
138
139 ;; 1076
140 (define data
141   (string->list "Hello, world!\n"))
142
143 ;;; 
144 ;; 1098 sh str table
145 (define tab
146   `(
147     #x00 ,@(string->list ".shstrtab")
148          #x00 ,@(string->list ".text")
149          #x00 ,@(string->list ".data")
150          #x00 #x00 #x00 #x00
151     ))
152
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))
163
164 (define sh-0
165   (append
166    sh-0-name
167    sh-0-type
168    sh-0-flags
169    sh-0-addr
170    sh-0-offset
171    sh-0-size
172    sh-0-link
173    sh-0-info
174    sh-0-addralign
175    sh-0-entsize
176    ))
177
178 (set! e-shentsize (int->bv16 (length sh-0)))
179
180 ;; 10e0 sh1: .text
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))
197
198 (define sh-text
199   (append
200    sh-text-name
201    sh-text-type
202    sh-text-flags
203    sh-text-addr
204    sh-text-offset
205    sh-text-size
206    sh-text-link
207    sh-text-info
208    sh-text-addralign
209    sh-text-entsize
210    ))
211
212 ;; 1108 sh2: .data
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))
226
227 (define sh-data
228   (append
229    sh-data-name
230    sh-data-type
231    sh-data-flags
232    sh-data-addr
233    sh-data-offset
234    sh-data-size
235    sh-data-link
236    sh-data-info
237    sh-data-addralign
238    sh-data-entsize
239    ))
240
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))
253
254 (define sh-tab
255   (append
256    sh-tab-name
257    sh-tab-type
258    sh-tab-flags
259    sh-tab-addr
260    sh-tab-offset
261    sh-tab-size
262    sh-tab-link
263    sh-tab-info
264    sh-tab-addralign
265    sh-tab-entsize
266    ))
267
268 (define section-headers
269   (append
270    sh-0
271    sh-text
272    sh-data
273    sh-tab
274    ))
275
276 (define (section-headers-offset)
277   (length
278    (append
279     (headers)
280     text
281     text-free
282     data
283     tab)))
284
285 (set! e-shoff (int->bv32 (section-headers-offset)))
286
287 (define exe
288   (append
289    (headers)
290    text
291    text-free
292    ;;1076 (+ 0804 8000): 0804 9076
293    data
294    tab
295    section-headers
296    ))
297 (map write-char exe)