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