Какова цель перемещения копии?

ПРЕДПОСЫЛКИ: Если исполняемый файл имеет ссылку на внешние данные, которая определена в общем объекте, компилятор будет использовать перемещение копии и поместит копию в свой раздел .bss. Перемещение копий подробно описано на этом сайте: http://www.shrubbery.net/solaris9ab/SUNWdev/LLM/p22.html#CHAPTER4-84604

Тем не менее, мой вопрос:

Можно ли это реализовать через GOT, как ссылку на внешние данные в общем объекте? Исполняемый файл может косвенно обращаться к этому внешнему коду через свою запись GOT, и эта запись GOT может быть заполнена реальным адресом этого символа во время выполнения. Я не знаю, почему GCC не реализует это так. Каковы преимущества переноса копии?


person zhebin jin    schedule 11.11.2014    source источник


Ответы (2)


В таких языках, как C и C++, адреса объектов со статической продолжительностью хранения определяются как адресные константы. Это означает, что концептуально на уровне языка они обрабатываются так, как будто их значения «известны» во время компиляции.

Конечно, в действительности это не так, если говорить о рассматриваемом вопросе. Чтобы противостоять этому, комбинация компилятор-компоновщик-загрузчик должна реализовать динамический механизм, который обеспечит полную поддержку концепции константы адреса на уровне языка. Интуитивно механизм на основе GOT, основанный на полной косвенности во время выполнения, был бы намного дальше от этой концепции, чем механизм, основанный на перемещении во время загрузки.

Во-первых, язык C был разработан как язык, который не требует динамической инициализации объектов со статической продолжительностью хранения, то есть концептуально нет инициализирующего кода запуска и нет проблем, связанных с порядком инициализации. Но в реализации на основе GOT для инициализации глобальной переменной с такой константой адреса потребуется код запуска, чтобы извлечь фактическое значение из GOT и поместить его в переменную. Между тем подход, основанный на перемещении, создает полную иллюзию того, что такая глобальная переменная начинает свою жизнь с правильного значения без какого-либо кода запуска.

Если вы посмотрите на функции, предоставляемые механизмом перемещения, вы заметите, что они синхронизированы со спецификацией адресной константы C. Например. окончательное значение может включать добавление фиксированного смещения, которое предназначено для реализации на стороне загрузчика операторов C [] и ->, допустимых в константных выражениях адреса C.

person AnT    schedule 11.11.2014

Можно ли это реализовать через GOT, как ссылку на внешние данные в общем объекте?

да. Чтобы это работало, вам нужно создать код, связанный с основным исполняемым файлом с помощью -fPIC. Поскольку это часто менее эффективно (дополнительная косвенность) и обычно не выполняется, компоновщику вместо этого приходится выполнять перемещение копирования.

Подробнее здесь .

person Employed Russian    schedule 11.11.2014