3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
6 ;;; scm.mes: This file is part of Mes.
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.
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.
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/>.
21 (define (int->bv32 value)
22 (let ((bv (make-bytevector 4)))
23 (bytevector-u32-native-set! bv 0 value)
26 (define (int->bv16 value)
27 (let ((bv (make-bytevector 2)))
28 (bytevector-u16-native-set! bv 0 value)
31 (define elf32-addr int->bv32)
32 (define elf32-half int->bv16)
33 (define elf32-off int->bv32)
34 (define elf32-word int->bv32)
36 (define (make-elf text data)
37 (define vaddress #x08048000)
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))
58 (define p-filesz (elf32-word 0))
59 (define p-memsz (elf32-word 0))
63 (define p-flags (elf32-word (logior PF-X PF-W PF-R)))
64 (define p-align (elf32-word 1))
66 (define (program-header type offset text)
70 (elf32-addr (+ vaddress offset))
71 (elf32-addr (+ vaddress offset))
72 (elf32-word (length text))
73 (elf32-word (length text))
78 (define (section-header name type offset text)
82 (elf32-word 3) ;; write/alloc must for data hmm
83 (elf32-addr (+ vaddress offset))
85 (elf32-word (length text))
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))
107 (define (elf-header size entry sections)
113 (elf32-addr (+ vaddress entry)) ;; e-entry
114 (elf32-off size) ;; e-phoff
115 (elf32-off sections) ;; e-shoff
117 (elf32-half size) ;; e-ehsize
125 (define elf-header-size
126 (length (elf-header 0 0 0)))
128 (define program-header-size
129 (length (program-header 0 0 '())))
132 (+ elf-header-size program-header-size))
134 (define (program-headers)
136 (program-header 1 text-offset (text 0))
144 ;;"Mes -- Maxwell Equations of Software\n"
145 ;;"https://gitlab.com/janneke/mes"
147 ;; #x05 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x02 #x00 #x00 #x00
148 ;; #\i #\3 #\8 #\6 #x00 #x00 #x00 #x00
153 #x00 ,@(string->list ".shstrtab")
154 #x00 ,@(string->list ".text")
155 #x00 ,@(string->list ".data")
156 #x00 ,@(string->list ".note")
164 (+ text-offset text-length))
166 (define data-address (+ data-offset vaddress))
175 (+ data-offset data-length))
178 (+ note-offset note-length))
183 (define section-headers-offset
184 (+ tab-offset tab-length))
187 (define SHT-PROGBITS 1)
188 (define SHT-STRTAB 3)
190 (define (section-headers)
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)
201 (elf-header elf-header-size text-offset section-headers-offset)