Первая причина для общих объектов. Если общие объекты не могли «запускаться из любого места», то сопоставление их с данным процессом может завершиться неудачей, если нужные адреса уже используются.
Вторая причина - нарушить предсказуемость выполнения программ; запуская программу со случайно выбранного адреса каждый раз, когда она запускается, вредоносные программы, нацеленные на программу, должны работать усерднее, чтобы сделать полезные эксплойты.
Третичная причина в том, что это легко, особенно с ARM и архитектурами amd64 , Эти арки избегают "mov% rax, <64bit-address>", в пользу "lea% rax, symbol (% rip)" или "mov% rax, symbol@GOTPCREL (% rip)". В первом случае адрес относится к счетчику программ; в первом GOT, содержащий адрес, относится к счетчику программ. Загрузчик (в ядре, а не команда ld), таким образом, должен только переписать GOT.
Это более громоздко в архитектуре i386, поскольку имеет слабую p c -относительную модель.