Making our own executable packer

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.