From what I understand:
When you compile code into a binary there is no need to translate the addresses in that binary. Since each process has it's own memory space, the addresses used in the binary file can be used at runtime.
However if you have a shared library, how does that get mapped into that processes memory space? If the library code uses virtual memory addresses they'd have to be changed for each process where the library is mapped to a different virtual memory address.
I'm not very experienced in this stuff (as you can probably guess), so sorry if anything is incredibly wrong.
Thanks in advance.