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