Making our own executable packer complete

In this series, we'll attempt to understand how Linux executables are organized, how they are executed, and how to make a program that takes an executable fresh off the linker and compresses it - just because we can.

Read part 1

Series overview

1. What's in a Linux executable?
2. Running an executable without exec
3. Position-independent code
4. ELF relocations
5. The simplest shared library
6. Loading multiple ELF objects
7. Dynamic symbol resolution
8. Dynamic linker speed and correctness
9. GDB scripting and Indirect functions
10. Safer memory-mapped structures
11. More ELF relocations
12. A no_std Rust binary
13. Thread-local storage
14. In the bowels of glibc
15. Between libcore and libstd
16. Everything but ELF
17. Running a self-relocatable ELF from memory
18. Fine, we'll relocate our own binary!

This series is complete.