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

This series is still on-going!

Previous series: Making our own ping
Still hungry? See all articles