Let\'s say I have a prog1.c which is build as prog1.out. In prog1.out there is a linker information that will tell where the elf will be loaded. These addresses will be a vi
There is no relation between virtual addresses and physical addresses (in common machines). The mapping always happen - this is part of what virtual addresses are for in the first place.
The "performance issues" are there - if at all - all the time, hidden inside the hardware. Whether there might have been an actual collision (had these addresses been physical ones) or not.
How it can protect the two processes having the same virtual addresses.
You don't, and doesn't need to. The memory contents for each processes is independent of any other's, and it's the work of te OS and hardware to ensure that. You may think about the term "virtual memory" as "process-specific own memory".
Note that all this discussion really have little to do with the contents of the object code or the linking/loading process - you can refer to any address at runtime, and the linker/loader need not know about it.