Revert "elf.mes: drop .note section."
[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 '(#x05 #x00))
42 (define e-shstrndx '(#x04 #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 (define note
144   '(
145     #x05 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x02 #x00 #x00 #x00
146     #\i #\3 #\8 #\6 #x00 #x00 #x00 #x00
147     ))
148
149 ;; 1098 sh str table
150 (define tab
151   `(
152     #x00 ,@(string->list ".shstrtab")
153          #x00 ,@(string->list ".text")
154          #x00 ,@(string->list ".data")
155          #x00 ,@(string->list ".note")
156          #x00 #x00 #x00 #x00
157     ))
158
159 (define sh-0-name      '(#x99 #x99 #x00 #x00))
160 (define sh-0-type      '(#x00 #x00 #x00 #x00))
161 (define sh-0-flags     '(#x00 #x00 #x00 #x00))
162 (define sh-0-addr      '(#x00 #x00 #x00 #x00))
163 (define sh-0-offset    '(#x00 #x00 #x00 #x00))
164 (define sh-0-size      '(#x00 #x00 #x00 #x00))
165 (define sh-0-link      '(#x00 #x00 #x00 #x00))
166 (define sh-0-info      '(#x00 #x00 #x00 #x00))
167 (define sh-0-addralign '(#x00 #x00 #x00 #x00))
168 (define sh-0-entsize   '(#x00 #x00 #x00 #x00))
169
170 (define sh-0
171   (append
172    sh-0-name
173    sh-0-type
174    sh-0-flags
175    sh-0-addr
176    sh-0-offset
177    sh-0-size
178    sh-0-link
179    sh-0-info
180    sh-0-addralign
181    sh-0-entsize
182    ))
183
184 (set! e-shentsize (int->bv16 (length sh-0)))
185
186 ;; 10e0 sh1: .text
187 (define sh-text-name      '(#x0b #x00 #x00 #x00))
188 (define sh-text-type      '(#x01 #x00 #x00 #x00))
189 (define sh-text-flags     '(#x06 #x00 #x00 #x00))
190 ;;(define sh-text-addr      '(#x54 #x80 #x04 #x08))
191 (define sh-text-addr      (int->bv32 (+ vaddress (text-offset))))
192 (set! e-entry sh-text-addr)
193 (set! p-vaddr sh-text-addr)
194 (set! p-paddr sh-text-addr)
195 ;;(define sh-text-offset    '(#x54 #x00 #x00 #x00))
196 (define sh-text-offset    (int->bv32 (text-offset)))
197 (set! p-offset sh-text-offset)
198 (define sh-text-size      '(#x22 #x00 #x00 #x00))
199 (define sh-text-link      '(#x00 #x00 #x00 #x00))
200 (define sh-text-info      '(#x00 #x00 #x00 #x00))
201 (define sh-text-addralign '(#x01 #x00 #x00 #x00))
202 (define sh-text-entsize   '(#x00 #x00 #x00 #x00))
203
204 (define sh-text
205   (append
206    sh-text-name
207    sh-text-type
208    sh-text-flags
209    sh-text-addr
210    sh-text-offset
211    sh-text-size
212    sh-text-link
213    sh-text-info
214    sh-text-addralign
215    sh-text-entsize
216    ))
217
218 ;; 1108 sh2: .data
219 (define sh-data-name      '(#x11 #x00 #x00 #x00))
220 (define sh-data-type      '(#x01 #x00 #x00 #x00))
221 (define sh-data-flags     '(#x03 #x00 #x00 #x00))
222 ;;(define sh-data-addr      '(#x76 #x90 #x04 #x08))
223 (define sh-data-addr      (int->bv32 data-address))
224 ;;(define sh-data-offset    '(#x76 #x10 #x00 #x00))
225 (define sh-data-offset    (int->bv32 data-offset))
226 ;;(define sh-data-size      '(#x0e #x00 #x00 #x00))
227 (define sh-data-size      (int->bv32 (length data)))
228 (define sh-data-link      '(#x00 #x00 #x00 #x00))
229 (define sh-data-info      '(#x00 #x00 #x00 #x00))
230 (define sh-data-addralign '(#x01 #x00 #x00 #x00))
231 (define sh-data-entsize   '(#x00 #x00 #x00 #x00))
232
233 (define sh-data
234   (append
235    sh-data-name
236    sh-data-type
237    sh-data-flags
238    sh-data-addr
239    sh-data-offset
240    sh-data-size
241    sh-data-link
242    sh-data-info
243    sh-data-addralign
244    sh-data-entsize
245    ))
246
247 ;; 1130 sh3: .note
248 (define sh-note-name      '(#x17 #x00 #x00 #x00))
249 (define sh-note-type      '(#x07 #x00 #x00 #x00))
250 (define sh-note-flags     '(#x00 #x00 #x00 #x00))
251 (define sh-note-addr      '(#x00 #x00 #x00 #x00))
252 (define sh-note-offset    '(#x84 #x10 #x00 #x00))
253 (define sh-note-size      '(#x14 #x00 #x00 #x00))
254 (define sh-note-link      '(#x00 #x00 #x00 #x00))
255 (define sh-note-info      '(#x00 #x00 #x00 #x00))
256 (define sh-note-addralign '(#x01 #x00 #x00 #x00))
257 (define sh-note-entsize   '(#x00 #x00 #x00 #x00))
258
259 (define sh-note
260   (append
261    sh-note-name
262    sh-note-type
263    sh-note-flags
264    sh-note-addr
265    sh-note-offset
266    sh-note-size
267    sh-note-link
268    sh-note-info
269    sh-note-addralign
270    sh-note-entsize
271    ))
272
273 ;; 1158 sh4: .shstrtab
274 (define sh-tab-name      '(#x01 #x00 #x00 #x00))
275 (define sh-tab-type      '(#x03 #x00 #x00 #x00))
276 (define sh-tab-flags     '(#x00 #x00 #x00 #x00))
277 (define sh-tab-addr      '(#x00 #x00 #x00 #x00))
278 (define sh-tab-offset    '(#x98 #x10 #x00 #x00))
279 (define sh-tab-size      '(#x1d #x00 #x00 #x00))
280 (define sh-tab-link      '(#x00 #x00 #x00 #x00))
281 (define sh-tab-info      '(#x00 #x00 #x00 #x00))
282 (define sh-tab-addralign '(#x01 #x00 #x00 #x00))
283 (define sh-tab-entsize   '(#x00 #x00 #x00 #x00))
284
285 (define sh-tab
286   (append
287    sh-tab-name
288    sh-tab-type
289    sh-tab-flags
290    sh-tab-addr
291    sh-tab-offset
292    sh-tab-size
293    sh-tab-link
294    sh-tab-info
295    sh-tab-addralign
296    sh-tab-entsize
297    ))
298
299 (define section-headers
300   (append
301    sh-0
302    sh-text
303    sh-data
304    sh-note
305    sh-tab
306    ))
307
308 (define (section-headers-offset)
309   (length
310    (append
311     (headers)
312     text
313     text-free
314     data
315     note
316     tab)))
317
318 (set! e-shoff (int->bv32 (section-headers-offset)))
319
320 (define exe
321   (append
322    (headers)
323    text
324    text-free
325    ;;1076 (+ 0804 8000): 0804 9076
326    data
327    ;;1084
328    note
329    ;;1098
330    tab
331    ;;10b8
332    section-headers
333    ))
334 (map write-char exe)