elf.mes: separate-out text, text-free and data sections.
[mes.git] / elf.mes
1 ;;; -*-scheme-*-
2
3 (define ei-magic '(#x7f #\E #\L #\F))
4 ;;(define ei-magic '(#x7f #x45 #x4c #x46))
5 (define ei-class '(#x01)) ;; 32 bit
6 (define ei-data '(#x01)) ;; little endian
7 (define ei-version '(#x01))
8 (define ei-osabi '(#x00))
9 (define ei-pad '(#x0 #x0 #x0 #x0 #x0 #x0 #x0 #x0))
10 (define e-ident
11   (append
12    ei-magic
13    ei-class
14    ei-data
15    ei-version
16    ei-osabi
17    ei-pad))
18
19 (define e-type '(#x02 #x00)) ;; ET_EXEC
20 (define e-machine '(#x03 #x00))
21 (define e-version '(#x01 #x00 #x00 #x00))
22 (define e-entry '(#x54 #x80 #x04 #x08))
23 (define e-phoff '(#x34 #x00 #x00 #x00))
24 (define e-shoff '(#xb8 #x10 #x00 #x00))
25 (define e-flags '(#x00 #x00 #x00 #x00))
26 (define e-ehsize '(#x34 #x00))
27 (define e-phentsize '(#x20 #x00))
28 (define e-phnum '(#x01 #x00))
29 (define e-shentsize '(#x28 #x00))
30 (define e-shnum '(#x05 #x00))
31 (define e-shstrndx '(#x04 #x00))
32
33 (define elf-header
34   (append
35    e-ident
36    e-type
37    e-machine
38    e-version
39    e-entry
40    e-phoff
41    e-shoff
42    e-flags
43    e-ehsize
44    e-phentsize
45    e-phnum
46    e-shentsize
47    e-shnum
48    e-shstrndx
49    ))
50
51 ;; 34
52 (define p-type '(#x01 #x00 #x00 #x00))
53 (define p-offset '(#x54 #x00 #x00 #x00))
54 (define p-vaddr '(#x54 #x80 #x04 #x08))
55
56 ;; 40
57 (define p-paddr '(#x54 #x80 #x04 #x08))
58 (define p-filesz '(#x10 #x30 #x00 #x00))
59 (define p-memsz '(#x10 #x30 #x00 #x00))
60 (define p-flags '(#x07 #x00 #x00 #x00))
61
62 ;; 50
63 (define p-align '(#x01 #x00 #x00 #x00))
64
65 (define program-header-0
66   (append
67    p-type
68    p-offset
69    p-vaddr
70    p-paddr
71    p-filesz
72    p-memsz
73    p-flags
74    p-align
75    ))
76
77 (define program-headers
78   (append
79    program-header-0
80    ))
81
82 (define sh-0-name      '(#x99 #x99 #x00 #x00))
83 (define sh-0-type      '(#x00 #x00 #x00 #x00))
84 (define sh-0-flags     '(#x00 #x00 #x00 #x00))
85 (define sh-0-addr      '(#x00 #x00 #x00 #x00))
86 (define sh-0-offset    '(#x00 #x00 #x00 #x00))
87 (define sh-0-size      '(#x00 #x00 #x00 #x00))
88 (define sh-0-link      '(#x00 #x00 #x00 #x00))
89 (define sh-0-info      '(#x00 #x00 #x00 #x00))
90 (define sh-0-addralign '(#x00 #x00 #x00 #x00))
91 (define sh-0-entsize   '(#x00 #x00 #x00 #x00))
92
93 (define sh-0
94   (append
95    sh-0-name
96    sh-0-type
97    sh-0-flags
98    sh-0-addr
99    sh-0-offset
100    sh-0-size
101    sh-0-link
102    sh-0-info
103    sh-0-addralign
104    sh-0-entsize
105    ))
106
107 ;; 10e0 sh1: .text
108 (define sh-text-name      '(#x0b #x00 #x00 #x00))
109 (define sh-text-type      '(#x01 #x00 #x00 #x00))
110 (define sh-text-flags     '(#x06 #x00 #x00 #x00))
111 (define sh-text-addr      '(#x54 #x80 #x04 #x08))
112 (define sh-text-offset    '(#x54 #x00 #x00 #x00))
113 (define sh-text-size      '(#x22 #x00 #x00 #x00))
114 (define sh-text-link      '(#x00 #x00 #x00 #x00))
115 (define sh-text-info      '(#x00 #x00 #x00 #x00))
116 (define sh-text-addralign '(#x01 #x00 #x00 #x00))
117 (define sh-text-entsize   '(#x00 #x00 #x00 #x00))
118
119 (define sh-text
120   (append
121    sh-text-name
122    sh-text-type
123    sh-text-flags
124    sh-text-addr
125    sh-text-offset
126    sh-text-size
127    sh-text-link
128    sh-text-info
129    sh-text-addralign
130    sh-text-entsize
131    ))
132
133 ;; 1108 sh2: .data
134 (define sh-data-name      '(#x11 #x00 #x00 #x00))
135 (define sh-data-type      '(#x01 #x00 #x00 #x00))
136 (define sh-data-flags     '(#x03 #x00 #x00 #x00))
137 (define sh-data-addr      '(#x76 #x90 #x04 #x08))
138 (define sh-data-offset    '(#x76 #x10 #x00 #x00))
139 (define sh-data-size      '(#x0e #x00 #x00 #x00))
140 (define sh-data-link      '(#x00 #x00 #x00 #x00))
141 (define sh-data-info      '(#x00 #x00 #x00 #x00))
142 (define sh-data-addralign '(#x01 #x00 #x00 #x00))
143 (define sh-data-entsize   '(#x00 #x00 #x00 #x00))
144
145 (define sh-data
146   (append
147    sh-data-name
148    sh-data-type
149    sh-data-flags
150    sh-data-addr
151    sh-data-offset
152    sh-data-size
153    sh-data-link
154    sh-data-info
155    sh-data-addralign
156    sh-data-entsize
157    ))
158
159 ;; 1130 sh3: .note
160 (define sh-note-name      '(#x17 #x00 #x00 #x00))
161 (define sh-note-type      '(#x07 #x00 #x00 #x00))
162 (define sh-note-flags     '(#x00 #x00 #x00 #x00))
163 (define sh-note-addr      '(#x00 #x00 #x00 #x00))
164 (define sh-note-offset    '(#x84 #x10 #x00 #x00))
165 (define sh-note-size      '(#x14 #x00 #x00 #x00))
166 (define sh-note-link      '(#x00 #x00 #x00 #x00))
167 (define sh-note-info      '(#x00 #x00 #x00 #x00))
168 (define sh-note-addralign '(#x01 #x00 #x00 #x00))
169 (define sh-note-entsize   '(#x00 #x00 #x00 #x00))
170
171 (define sh-note
172   (append
173    sh-note-name
174    sh-note-type
175    sh-note-flags
176    sh-note-addr
177    sh-note-offset
178    sh-note-size
179    sh-note-link
180    sh-note-info
181    sh-note-addralign
182    sh-note-entsize
183    ))
184
185 ;; 1158 sh4: .shstrtab
186 (define sh-tab-name      '(#x01 #x00 #x00 #x00))
187 (define sh-tab-type      '(#x03 #x00 #x00 #x00))
188 (define sh-tab-flags     '(#x00 #x00 #x00 #x00))
189 (define sh-tab-addr      '(#x00 #x00 #x00 #x00))
190 (define sh-tab-offset    '(#x98 #x10 #x00 #x00))
191 (define sh-tab-size      '(#x1d #x00 #x00 #x00))
192 (define sh-tab-link      '(#x00 #x00 #x00 #x00))
193 (define sh-tab-info      '(#x00 #x00 #x00 #x00))
194 (define sh-tab-addralign '(#x01 #x00 #x00 #x00))
195 (define sh-tab-entsize   '(#x00 #x00 #x00 #x00))
196
197 (define sh-tab
198   (append
199    sh-tab-name
200    sh-tab-type
201    sh-tab-flags
202    sh-tab-addr
203    sh-tab-offset
204    sh-tab-size
205    sh-tab-link
206    sh-tab-info
207    sh-tab-addralign
208    sh-tab-entsize
209    ))
210
211 (define section-headers
212   (append
213    sh-0
214    sh-text
215    sh-data
216    sh-note
217    sh-tab
218    ))
219
220 ;;0054 (+ 0804 8000): 0804 8054
221 (define text
222   '(
223     #xba #x0e #x00 #x00 #x00       ;; mov    $0xe,%edx
224     #xb9 #x76 #x90 #x04 #x08       ;; mov    $0x8049076,%ecx
225     #xbb #x01 #x00 #x00 #x00       ;; mov    $0x1,%ebx
226     #xb8 #x04 #x00 #x00 #x00       ;; mov    $0x4,%eax
227     #xcd #x80                      ;; int    $0x80
228     #xbb #x00 #x00 #x00 #x00       ;; mov    $0x0,%ebx
229     #xb8 #x01 #x00 #x00 #x00       ;; mov    $0x1,%eax
230     #xcd #x80                      ;; int    $0x80
231
232     #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
233 ))
234
235 (define text-free
236   (vector->list (make-vector (- #x1076 #x80 ) #x00))
237   )
238
239 ;; 1076
240 (define data
241   '(
242     #\H #\e #\l #\l #\o #\, #\space #\w #\o #\r
243     #\l #\d #\! #\newline
244    ))
245
246 (define note
247   '(
248     #x05 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x02 #x00 #x00 #x00
249          #\i #\3 #\8 #\6 #x00 #x00 #x00 #x00
250          ))
251
252 ;; 1098 sh str table
253 (define tab
254   '(
255
256    #x00 #\. #\s #\h #\s #\t #\r #\t
257
258    #\a #\b #x00 #\. #\t #\e #\x #\t #x00 #\. #\d #\a #\t #\a #x00 #\.
259    #\n #\o #\t #\e  #x00 #x00 #x00 #x00
260    ))
261
262 (define exe
263   (append
264    elf-header
265    program-headers
266    text
267    text-free
268    ;;1076 (+ 0804 8000): 0804 9076
269    data
270    ;;1084
271    note
272    ;;1098
273    tab
274    ;;10b8
275    section-headers
276    ))
277 (map write-char exe)