В таких языках, как C и C++, адреса объектов со статической продолжительностью хранения определяются как адресные константы. Это означает, что концептуально на уровне языка они обрабатываются так, как будто их значения «известны» во время компиляции.
Конечно, в действительности это не так, если говорить о рассматриваемом вопросе. Чтобы противостоять этому, комбинация компилятор-компоновщик-загрузчик должна реализовать динамический механизм, который обеспечит полную поддержку концепции константы адреса на уровне языка. Интуитивно механизм на основе GOT, основанный на полной косвенности во время выполнения, был бы намного дальше от этой концепции, чем механизм, основанный на перемещении во время загрузки.
Во-первых, язык C был разработан как язык, который не требует динамической инициализации объектов со статической продолжительностью хранения, то есть концептуально нет инициализирующего кода запуска и нет проблем, связанных с порядком инициализации. Но в реализации на основе GOT для инициализации глобальной переменной с такой константой адреса потребуется код запуска, чтобы извлечь фактическое значение из GOT и поместить его в переменную. Между тем подход, основанный на перемещении, создает полную иллюзию того, что такая глобальная переменная начинает свою жизнь с правильного значения без какого-либо кода запуска.
Если вы посмотрите на функции, предоставляемые механизмом перемещения, вы заметите, что они синхронизированы со спецификацией адресной константы C. Например. окончательное значение может включать добавление фиксированного смещения, которое предназначено для реализации на стороне загрузчика операторов C []
и ->
, допустимых в константных выражениях адреса C.
person
AnT
schedule
11.11.2014