2014-11-11 2 views
2

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

Однако мой вопрос:

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

ответ

0

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

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

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

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

2

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

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

Дополнительная информация here.