# MEZ = Meow5 + ELF + Zig

This is a utility written in Zig to help me debug the 32-bit ELF executables
I'm exporting from
<a href="https://ratfactor.com/meow5/">Meow5</a>,
my toy language experiment.

It's highly visual and shows me exactly what I want to know about:

* Program segments (of type LOAD)
* Entry point address
* Hex dump of the data that will be loaded
* *Where* in the hex dump that entry point address lives!

It also includes a `zem.zig` program that writes a multi-segment
ELF exectuable that prints "Hello world." to make sure I'm doing
it right.

Example output (of Meow5 executable itself):

<pre style="background: #000; color: #DDD;">
$ mez meow5
+-[ELF Header]------------------------------------------+
| <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 |
| 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> |
| <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> /-----+
+--+---------------------------------------------/
   +-- Entry point address: <font color="#FF55FF">0x0804A5FA</font>
   +-- Program header file offset: <font color="#FFFF55">0x34</font>
   +-- Program header size: <font color="#FFFF55">32 (0x20)</font>
   \-- Program header count: <font color="#FFFF55">3</font>
    |
    +-- Program Header 0 at 0x34, type: <font color="#55FFFF">PT_LOAD</font>
    +-- Program Header 1 at 0x54, type: <font color="#55FFFF">PT_LOAD</font>
    +-- Program Header 2 at 0x74, type: <font color="#55FFFF">PT_LOAD</font>

+-[<font color="#FFFF55">Program Header 0</font>]------------------------------+
| <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> |
| <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> |
+--+----------------------------------------------+
   +-- File data start offset: <font color="#AA5500">0x0</font>
   +-- File data bytes to load: <font color="#AA5500">148 (0x94)</font>
   +-- Memory segment start addr: <font color="#AA00AA">0x08048000</font>
   +-- Memory segment byte size: <font color="#AA00AA">148 (0x94)</font>
   +-- Memory segment flags: <font color="#AA00AA">R (0x4)</font>
from 8048000 to 8048094...
0x08048000 <font color="#AAAAAA">7f 45 4c 46 01 01 01 00 00 00 00 00 </font>.<font color="#00AAAA">ELF</font>........
0x0804800c <font color="#AAAAAA">00 00 00 00 02 00 03 00 01 00 00 00 </font>............
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>..
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>.
  ...100 more bytes to load...

+-[<font color="#FFFF55">Program Header 1</font>]------------------------------+
| <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> |
| <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> |
+--+----------------------------------------------+
   +-- File data start offset: <font color="#AA5500">0x1000</font>
   +-- File data bytes to load: <font color="#AA5500">6169 (0x1819)</font>
   +-- Memory segment start addr: <font color="#AA00AA">0x08049000</font>
   +-- Memory segment byte size: <font color="#AA00AA">6169 (0x1819)</font>
   +-- Memory segment flags: <font color="#AA00AA">R+X (0x5)</font>
   +-- <font color="#FF55FF">Contains entry point 0x0804A5FA</font>
from 8049000 to 804a819...
0x08049000 <font color="#AAAAAA">5b b8 01 00 00 00 cd 80 a1 a4 c9 04 </font><font color="#00AAAA">[</font>...........
0x0804900c <font color="#AAAAAA">08 ff e0 00 00 00 00 08 00 00 00 0f </font>............
0x08049018 <font color="#AAAAAA">00 00 00 03 00 00 00 65 78 69 74 00 </font>.......<font color="#00AAAA">exit</font>.
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">&lt;</font>..<font color="#00AAAA">t</font>.
  ...Skipping to entry point...
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>...
0x0804a5fc <font color="#AAAAAA">05 3c b1 04 08 02 00 00 00 c7 05 44 </font>.<font color="#00AAAA">&lt;</font>.........<font color="#00AAAA">D</font>
0x0804a608 <font color="#AAAAAA">b1 04 08 00 00 00 00 c7 05 4c b1 04 </font>.........<font color="#00AAAA">L</font>..
</pre>

