Возможно, ваше замешательство со значением extern
. Поскольку привязка по умолчанию равна extern
, любая переменная, объявленная вне сферы видимости без ключевого слова static
, равна extern
.
Причина, по которой необходим GOT, заключается в том, что адрес переменных, к которым обращается код общей библиотеки, неизвестен на момент генерации общей библиотеки. Это зависит либо от адреса загрузки, в который загружается библиотека (если определение находится в самой библиотеке), либо для стороннего кода, в котором определена переменная (если определение находится в другом месте). Поэтому вместо того, чтобы помещать адрес inline в код, компилятор генерирует код для чтения GOT разделяемой библиотеки, а затем загружает адрес из GOT во время выполнения.
Если переменная известна быть определены в пределах одной и той же общей библиотеки (либо потому, что это static
или атрибут видимость hidden
или protected
она используется), то адрес относительно кода в библиотеке может быть зафиксирована на уровне время создания файла общей библиотеки. В этом случае, вместо того, чтобы выполнять поиск через GOT, компилятор просто генерирует код для доступа к переменной с обращением к программному счету. Это дешевле как во время выполнения, так и во время загрузки (поскольку весь процесс поиска и перемещения символа можно пропустить во время загрузки).
Любая идея, как заставить gcc выполнять поиск через GOT для статических переменных? –
Я не могу сразу думать о пути; зачем вам это нужно? –
Я пытаюсь сделать свое приложение для процессора ARM в качестве независимого от позиции исполняемого файла, и все работает отлично, за исключением статических переменных. Проблема состоит в том, что секции .text и .data/.bss имеют разные смещения смещения, поэтому относительный доступ к статическим переменным не зависит, поскольку доступ через GOT работает нормально. –