mescc.scm: first a.out produced from main.c.
[mes.git] / lib / elf.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; scm.mes: This file is part of Mes.
7 ;;;
8 ;;; Mes is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; Mes is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
20
21 (define (int->bv32 value)
22   (let ((bv (make-bytevector 4)))
23     (bytevector-u32-native-set! bv 0 value)
24     bv))
25
26 (define (int->bv16 value)
27   (let ((bv (make-bytevector 2)))
28     (bytevector-u16-native-set! bv 0 value)
29     bv))
30
31 (define elf32-addr int->bv32)
32 (define elf32-half int->bv16)
33 (define elf32-off int->bv32)
34 (define elf32-word int->bv32)
35
36 (define (make-elf text data)
37  (define vaddress #x08048000)
38
39  (define ei-magic `(#x7f ,@(string->list "ELF")))
40  (define ei-class '(#x01)) ;; 32 bit
41  (define ei-data '(#x01)) ;; little endian
42  (define ei-version '(#x01))
43  (define ei-osabi '(#x00))
44  (define ei-pad '(#x0 #x0 #x0 #x0 #x0 #x0 #x0 #x0))
45  (define e-ident
46    (append
47     ei-magic
48     ei-class
49     ei-data
50     ei-version
51     ei-osabi
52     ei-pad))
53
54  (define ET-EXEC 2)
55  (define EM-386 3)
56  (define EV-CURRENT 1)
57
58  (define p-filesz (elf32-word 0))
59  (define p-memsz (elf32-word 0))
60  (define PF-X 1)
61  (define PF-W 2)
62  (define PF-R 4)
63  (define p-flags (elf32-word (logior PF-X PF-W PF-R)))
64  (define p-align (elf32-word 1))
65
66  (define (program-header type offset text)
67    (append
68     (elf32-word type)
69     (elf32-off offset)
70     (elf32-addr (+ vaddress offset))
71     (elf32-addr (+ vaddress offset))
72     (elf32-word (length text))
73     (elf32-word (length text))
74     p-flags
75     p-align
76     ))
77
78  (define (section-header name type offset text)
79    (append
80     (elf32-word name)
81     (elf32-word type)
82     (elf32-word 3) ;; write/alloc must for data hmm
83     (elf32-addr (+ vaddress offset))
84     (elf32-off offset) 
85     (elf32-word (length text))
86     (elf32-word 0)
87     (elf32-word 0)
88     (elf32-word 1)
89     (elf32-word 0)))
90
91
92  (define e-type (elf32-half ET-EXEC))
93  (define e-machine (elf32-half EM-386))
94  (define e-version (elf32-word EV-CURRENT))
95  (define e-entry (elf32-addr 0))
96  ;;(define e-entry (elf32-addr (+ vaddress text-offset)))
97  ;;(define e-phoff (elf32-off 0))
98  (define e-shoff (elf32-off 0))
99  (define e-flags (elf32-word 0))
100  ;;(define e-ehsize (elf32-half 0))
101  (define e-phentsize (elf32-half (length (program-header 0 0 '()))))
102  (define e-phnum (elf32-half 1))
103  (define e-shentsize (elf32-half (length (section-header 0 0 0 '()))))
104  (define e-shnum (elf32-half 5))
105  (define e-shstrndx (elf32-half 4))
106
107  (define (elf-header size entry sections)
108    (append
109     e-ident
110     e-type
111     e-machine
112     e-version
113     (elf32-addr (+ vaddress entry)) ;; e-entry
114     (elf32-off size) ;; e-phoff
115     (elf32-off sections) ;; e-shoff
116     e-flags
117     (elf32-half size) ;; e-ehsize
118     e-phentsize
119     e-phnum
120     e-shentsize
121     e-shnum
122     e-shstrndx
123     ))
124
125  (define elf-header-size
126    (length (elf-header 0 0 0)))
127
128  (define program-header-size
129    (length (program-header 0 0 '())))
130
131  (define text-offset
132    (+ elf-header-size program-header-size))
133
134  (define (program-headers)
135    (append
136     (program-header 1 text-offset (text 0))
137     ))
138
139
140  (define note
141    (string->list
142     (string-append
143      "MES"
144      ;;"Mes -- Maxwell Equations of Software\n"
145      ;;"https://gitlab.com/janneke/mes"
146      )
147     ;; #x05 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x02 #x00 #x00 #x00
148     ;; #\i #\3 #\8 #\6 #x00 #x00 #x00 #x00
149     ))
150
151  (define tab
152    `(
153      #x00 ,@(string->list ".shstrtab")
154           #x00 ,@(string->list ".text")
155           #x00 ,@(string->list ".data")
156           #x00 ,@(string->list ".note")
157           #x00 #x00 #x00 #x00
158           ))
159
160  (define text-length
161    (length (text 0)))
162
163  (define data-offset
164    (+ text-offset text-length))
165
166  (define data-address (+ data-offset vaddress))
167
168  (define data-length
169    (length data))
170
171  (define note-length
172    (length note))
173
174  (define note-offset
175    (+ data-offset data-length))
176
177  (define tab-offset
178    (+ note-offset note-length))
179
180  (define tab-length
181    (length tab))
182
183  (define section-headers-offset
184    (+ tab-offset tab-length))
185
186
187  (define SHT-PROGBITS 1)
188  (define SHT-STRTAB 3)
189  (define SHT-NOTE 7)
190  (define (section-headers)
191    (append
192     (section-header 0 0 0 '())
193     (section-header 11 SHT-PROGBITS text-offset (text 0))
194     (section-header 17 SHT-PROGBITS data-offset data)
195     (section-header 23 SHT-NOTE note-offset note)
196     (section-header 1 SHT-STRTAB tab-offset tab)
197     ))
198
199  (define exe
200    (append
201     (elf-header elf-header-size text-offset section-headers-offset)
202     (program-headers)
203     (text data-address)
204     data
205     note
206     tab
207     (section-headers)
208     ))
209  exe)