summary refs log tree commit diff
path: root/make-hello.e
blob: 797c2288b49b19a4d1775a62c61ac05d6d885ab7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
~ current output point, string pointer
: pack-raw-string
  { unpack8 dup } { 3roll swap pack8 swap } while drop drop ;

: origin 0x08000000 ;

: init-labels
  heap hexdump
  latest @ dup word-heading hexdump
  ~ s" labels" create
  8 allocate s" labels" variable
  0 s" labels" find entry-to-execution-token execute !
  ;
init-labels
latest @ dup word-heading hexdump
labels @ .hex newline

: new-label
  s" frobboz" labels create-in
  ;
here @
new-label
latest @ dup word-heading hexdump
labels @ .hex newline
hexdump

~ ~~
~ ~~ ELF header
~ ~~
~ ~~   This is the top-level ELF header, for the entire file. An ELF always
~ ~~ has exactly one of this header, which is always at the start of the file.
~ ~~
: elf-file-header
  0x7f pack8 s" ELF" pack-raw-string        ~ magic number
  2 pack8                                   ~ 64-bit
  1 pack8                                   ~ little-endian
  1 pack8                                   ~ ELF header format v1
  0 pack8                                   ~ System-V ABI
  0 pack64                                  ~ (padding)

  2 pack16                                  ~ executable
  0x3e pack16                               ~ Intel x86-64
  1 pack32                                  ~ ELF format version

  ~ Compute the entry pointer.
  origin 0x78 + pack64                      ~ entry point
    ~ This includes the origin, intentionally.

  0 pack64                                  ~ program header offset
    ~ We place the program header immediately after the ELF header. This
    ~ offset is from the start of the file.
  0 pack64                                  ~ section header offset
  0 pack32                                  ~ processor flags
  64 pack16                                 ~ ELF header size
  56 pack16                                 ~ program header entry size
  1 pack16                                  ~ number of program header entries
  0 pack16                                  ~ section header entry size
  0 pack16                                  ~ number of section header entries
  0 pack16                                  ~ section name string table index
  ;

~ ~~
~ ~~ Program header
~ ~~
~ ~~   An ELF program header consists of any number of these entries; they are
~ ~~ always consecutive, but may be anywhere in the file. We always have
~ ~~ exactly one, and it's always right after the ELF file header.
~ ~~
: elf-program-header
  1 pack32                                  ~ "loadable" segment type
  0x05 pack32                               ~ read+execute permission
  0 pack64                                  ~ offset in file
  origin pack64                             ~ virtual address
    ~ required, but can be anything, subject to alignment
  0 pack64                                  ~ physical address (ignored)

  ~ Fill in 0 as the file size for now, to avoid uninitialized memory.
  0 pack64                                  ~ size in file
    ~ TODO call use-label here
  0 pack64                                  ~ size in memory
    ~ TODO call use-label here

  0 pack64                                  ~ segment alignment
    ~ for relocation, but this doesn't apply to us
  ;

: output-start-routine
  ~ lit 1 :rax mov-reg64-imm32
  ;

: all-contents
  ~ current output point
  elf-file-header
  elf-program-header
  output-start-routine
  ;

0x1000 allocate dup
~ output memory start, current output point

all-contents

~ output memory start, current output point
over - swap sys-write bye