Skip to content

Making our own executable packer

18 parts 8 hours 53 min #os #linux #rust #assembly 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.

Start with part 1 →

18 parts

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

Articles and videos by Amos Wenger.

Support

  • Patreon
  • GitHub Sponsors
  • Discord

Follow

  • YouTube
  • Bluesky
  • Mastodon
  • LinkedIn
  • TikTok
  • Instagram
  • RSS
About Legal notice Privacy policy Terms and conditions