Программа обычно состоит из нескольких модулей, созданных компоновщиком. Существует исполняемый файл и, как правило, несколько общих библиотек. В некоторых системах один исполняемый файл может загрузить другой исполняемый файл и вызвать его функцию запуска как функцию.
Если бы все эти скомпилированные использования имели фиксированные адреса, вероятно, при загрузке возникли бы конфликты. Если два связанных модуля использовали один и тот же адрес, приложение не может быть загружено.
В течение десятилетий перемещаемый код был решением этой проблемы. Модуль может быть загружен где угодно. Некоторые системы переходят на следующий шаг и случайным образом помещают модули в память для обеспечения безопасности.
В некоторых ситуациях код не может быть чисто перемещаемым.
Если у вас есть что-то вроде этого:
static int b, *a = &b ;
инициализация зависит от того, где модель находится в памяти (и где находится «b»). Линкеры обычно генерируют информацию для таких конструкций, чтобы загрузчик мог их исправить.
Таким образом, это не правильно:
Я всегда считал, что разрешение абсолютных адресов - это полностью работа линкера.