This stems from the problem that when the program is compiled, the compiler does not know where the program will be placed in memory. While it would in principle be possible for the program to be compiled in such a way that it could be relocated, this can be awkward and inefficient. What is needed is a way to get from the addresses generated by the compiler (which assume that the program has been loaded at address 0, say)---the logical (or virtual addresses), to the physical addresses corresponding to where the program has actually been loaded in memory.
It makes sense to compile programs to begin at location 0 in (virtual) memory, so this is what is shown in the diagram to the left. The program is 20416 bytes in length. It is relocated to memory location 64E016.
In this example, say there is a subroutine to be called at location 11B16 in the program. All references to this subroutine must be relocated, to refer to location (64E016 + 11B16) = 65FB16.