Compile, link, load — the pipeline above the binary
A binary is the bottom of a pipeline. To reverse-engineer it intelligently you need the layers above it.
source.c ──compile──▶ source.o (object)
│
source.h │
▼
link ──▶ a.out / app.exe (executable)
│
▼
exec() ──▶ image in process memory ──▶ entry point
- Compile. Source → object file. Each object holds the compiled code for one translation unit plus unresolved references to symbols defined elsewhere.
- Link. Object files + libraries → one executable. The linker resolves cross-object references, lays out sections, and decides which libraries are bound at link time vs deferred to the loader.
- Load. The OS reads the file, maps segments into memory, applies any relocations, hands control to the entry point.
A static binary inlines all library code. A dynamic binary defers most library resolution to the loader. Almost every system binary you will reverse is dynamic — meaning the file alone does not contain everything that runs. The loader and the shared libraries it pulls in are part of the picture from the first jump.
