1 # MEZ = Meow5 + ELF + Zig
     
2 
     3 This is a utility written in Zig to help me debug the 32-bit ELF executables
     
4 I'm exporting from
     
5 <a href="https://ratfactor.com/meow5/">Meow5</a>,
     
6 my toy language experiment.
     
7 
     8 It's highly visual and shows me exactly what I want to know about:
     
9 
    10 * Program segments (of type LOAD)
    
11 * Entry point address
    
12 * Hex dump of the data that will be loaded
    
13 * *Where* in the hex dump that entry point address lives!
    
14 
    15 It also includes a `zem.zig` program that writes a multi-segment
    
16 ELF exectuable that prints "Hello world." to make sure I'm doing
    
17 it right.
    
18 
    19 Example output (of Meow5 executable itself):
    
20 
    21 <pre style="background: #000; color: #DDD;">
    
22 $ mez meow5
    
23 +-[ELF Header]------------------------------------------+
    
24 | <font color="#00AA00">7F</font> <font color="#00AA00">E</font>  <font color="#00AA00">L</font>  <font color="#00AA00">F</font>  01 01 01 00 <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> 02 00 |
    
25 | 03 00 01 00 00 00 <font color="#FF55FF">FA</font> <font color="#FF55FF">A5</font> <font color="#FF55FF">04</font> <font color="#FF55FF">08</font> <font color="#FFFF55">34</font> <font color="#FFFF55">00</font> <font color="#FFFF55">00</font> <font color="#FFFF55">00</font> <font color="#AAAAAA">88</font> <font color="#AAAAAA">6A</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> |
    
26 | <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> 34 00 <font color="#FFFF55">20</font> <font color="#FFFF55">00</font> <font color="#FFFF55">03</font> <font color="#FFFF55">00</font> <font color="#AAAAAA">28</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">0B</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">0A</font> <font color="#AAAAAA">00</font> /-----+
    
27 +--+---------------------------------------------/
    
28    +-- Entry point address: <font color="#FF55FF">0x0804A5FA</font>
    
29    +-- Program header file offset: <font color="#FFFF55">0x34</font>
    
30    +-- Program header size: <font color="#FFFF55">32 (0x20)</font>
    
31    \-- Program header count: <font color="#FFFF55">3</font>
    
32     |
    
33     +-- Program Header 0 at 0x34, type: <font color="#55FFFF">PT_LOAD</font>
    
34     +-- Program Header 1 at 0x54, type: <font color="#55FFFF">PT_LOAD</font>
    
35     +-- Program Header 2 at 0x74, type: <font color="#55FFFF">PT_LOAD</font>
    
36 
    37 +-[<font color="#FFFF55">Program Header 0</font>]------------------------------+
    
38 | <font color="#55FFFF">01</font> <font color="#55FFFF">00</font> <font color="#55FFFF">00</font> <font color="#55FFFF">00</font> <font color="#AA5500">00</font> <font color="#AA5500">00</font> <font color="#AA5500">00</font> <font color="#AA5500">00</font> <font color="#AA00AA">00</font> <font color="#AA00AA">80</font> <font color="#AA00AA">04</font> <font color="#AA00AA">08</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">80</font> <font color="#AAAAAA">04</font> <font color="#AAAAAA">08</font> |
    
39 | <font color="#AA5500">94</font> <font color="#AA5500">00</font> <font color="#AA5500">00</font> <font color="#AA5500">00</font> <font color="#AA00AA">94</font> <font color="#AA00AA">00</font> <font color="#AA00AA">00</font> <font color="#AA00AA">00</font> <font color="#AA00AA">04</font> <font color="#AA00AA">00</font> <font color="#AA00AA">00</font> <font color="#AA00AA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">10</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> |
    
40 +--+----------------------------------------------+
    
41    +-- File data start offset: <font color="#AA5500">0x0</font>
    
42    +-- File data bytes to load: <font color="#AA5500">148 (0x94)</font>
    
43    +-- Memory segment start addr: <font color="#AA00AA">0x08048000</font>
    
44    +-- Memory segment byte size: <font color="#AA00AA">148 (0x94)</font>
    
45    +-- Memory segment flags: <font color="#AA00AA">R (0x4)</font>
    
46 from 8048000 to 8048094...
    
47 0x08048000 <font color="#AAAAAA">7f 45 4c 46 01 01 01 00 00 00 00 00 </font>.<font color="#00AAAA">ELF</font>........
    
48 0x0804800c <font color="#AAAAAA">00 00 00 00 02 00 03 00 01 00 00 00 </font>............
    
49 0x08048018 <font color="#AAAAAA">fa a5 04 08 34 00 00 00 88 6a 00 00 </font>....<font color="#00AAAA">4</font>....<font color="#00AAAA">j</font>..
    
50 0x08048024 <font color="#AAAAAA">00 00 00 00 34 00 20 00 03 00 28 00 </font>....<font color="#00AAAA">4</font>.....<font color="#00AAAA">(</font>.
    
51   ...100 more bytes to load...
    
52 
    53 +-[<font color="#FFFF55">Program Header 1</font>]------------------------------+
    
54 | <font color="#55FFFF">01</font> <font color="#55FFFF">00</font> <font color="#55FFFF">00</font> <font color="#55FFFF">00</font> <font color="#AA5500">00</font> <font color="#AA5500">10</font> <font color="#AA5500">00</font> <font color="#AA5500">00</font> <font color="#AA00AA">00</font> <font color="#AA00AA">90</font> <font color="#AA00AA">04</font> <font color="#AA00AA">08</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">90</font> <font color="#AAAAAA">04</font> <font color="#AAAAAA">08</font> |
    
55 | <font color="#AA5500">19</font> <font color="#AA5500">18</font> <font color="#AA5500">00</font> <font color="#AA5500">00</font> <font color="#AA00AA">19</font> <font color="#AA00AA">18</font> <font color="#AA00AA">00</font> <font color="#AA00AA">00</font> <font color="#AA00AA">05</font> <font color="#AA00AA">00</font> <font color="#AA00AA">00</font> <font color="#AA00AA">00</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">10</font> <font color="#AAAAAA">00</font> <font color="#AAAAAA">00</font> |
    
56 +--+----------------------------------------------+
    
57    +-- File data start offset: <font color="#AA5500">0x1000</font>
    
58    +-- File data bytes to load: <font color="#AA5500">6169 (0x1819)</font>
    
59    +-- Memory segment start addr: <font color="#AA00AA">0x08049000</font>
    
60    +-- Memory segment byte size: <font color="#AA00AA">6169 (0x1819)</font>
    
61    +-- Memory segment flags: <font color="#AA00AA">R+X (0x5)</font>
    
62    +-- <font color="#FF55FF">Contains entry point 0x0804A5FA</font>
    
63 from 8049000 to 804a819...
    
64 0x08049000 <font color="#AAAAAA">5b b8 01 00 00 00 cd 80 a1 a4 c9 04 </font><font color="#00AAAA">[</font>...........
    
65 0x0804900c <font color="#AAAAAA">08 ff e0 00 00 00 00 08 00 00 00 0f </font>............
    
66 0x08049018 <font color="#AAAAAA">00 00 00 03 00 00 00 65 78 69 74 00 </font>.......<font color="#00AAAA">exit</font>.
    
67 0x08049024 <font color="#AAAAAA">58 b9 00 00 00 00 80 3c 08 00 74 03 </font><font color="#00AAAA">X</font>......<font color="#00AAAA"><</font>..<font color="#00AAAA">t</font>.
    
68   ...Skipping to entry point...
    
69 0x0804a5f0 <font color="#AAAAAA">00 6d 61 6b 65 5f 65 6c 66 00 </font><span style="background-color:#FF55FF"><font color="#000000">fc</font></span> c7 .<font color="#00AAAA">make_elf</font>...
    
70 0x0804a5fc <font color="#AAAAAA">05 3c b1 04 08 02 00 00 00 c7 05 44 </font>.<font color="#00AAAA"><</font>.........<font color="#00AAAA">D</font>
    
71 0x0804a608 <font color="#AAAAAA">b1 04 08 00 00 00 00 c7 05 4c b1 04 </font>.........<font color="#00AAAA">L</font>..
    
72 </pre>
    
73