Eu acho que esses conceitos são melhor descritos nesta referência, intitulada: Notas de aula dos sistemas operacionais Ceng 328 - Endereçamento .
trecho
- Addresses may be represented in different ways during these steps.
- Addresses in the source program are generally symbolic (such as $count$).
- A compiler will typically bind these symbolic addresses to relocatable addresses (such as "14 bytes from the beginning of this module").
- The linkage editor or loader will in turn bind the relocatable addresses to absolute addresses (such as 74014).
- Each binding is a mapping from one address space to another.
- Classically, the binding of instructions and data to memory addresses can be done at any step along the way:
- Compile time. The compiler translates symbolic addresses to absolute addresses. If you know at compile time where the process will reside in memory, then absolute code can be generated (Static).
- Load time. The compiler translates symbolic addresses to relative (relocatable) addresses. The loader translates these to absolute addresses. If it is not known at compile time where the process will reside in memory, then the compiler must generate relocatable code (Static).
- Execution time. If the process can be moved during its execution from one memory segment to another, then binding must be delayed until run time. The absolute addresses are generated by hardware. Most general-purpose OSs use this method (Dynamic).
- Static-new locations are determined before execution. Dynamic-new locations are determined during execution.
Outras leituras
Se você estiver interessado neste tópico, sugiro que leia as seguintes páginas da Wikipédia.
Um bom exemplo das diferenças entre tempos de ligação iniciais e atrasados é coberto aqui: Tempos de encadernação , bem como aqui neste artigo intitulado: Vinculação antecipada versus atrasada .