2012-03-13 3 views
11

Я читаю this article on PLT (Process Linkage Table) and GOT (Global Offset Table). Хотя цель PLT мне понятна, я все еще смущен GOT. Из статьи я понял, что GOT необходим только для переменных, объявленных как extern в общей библиотеке. Для глобальных переменных, объявленных как static в коде общей библиотеки, это не требуется.Таблица связывания процесса и глобальная таблица смещения

Мое понимание правильно, или я полностью не пропущу точку.

ответ

16

Возможно, ваше замешательство со значением extern. Поскольку привязка по умолчанию равна extern, любая переменная, объявленная вне сферы видимости без ключевого слова static, равна extern.

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

Если переменная известна быть определены в пределах одной и той же общей библиотеки (либо потому, что это static или атрибут видимость hidden или protected она используется), то адрес относительно кода в библиотеке может быть зафиксирована на уровне время создания файла общей библиотеки. В этом случае, вместо того, чтобы выполнять поиск через GOT, компилятор просто генерирует код для доступа к переменной с обращением к программному счету. Это дешевле как во время выполнения, так и во время загрузки (поскольку весь процесс поиска и перемещения символа можно пропустить во время загрузки).

+0

Любая идея, как заставить gcc выполнять поиск через GOT для статических переменных? –

+0

Я не могу сразу думать о пути; зачем вам это нужно? –

+0

Я пытаюсь сделать свое приложение для процессора ARM в качестве независимого от позиции исполняемого файла, и все работает отлично, за исключением статических переменных. Проблема состоит в том, что секции .text и .data/.bss имеют разные смещения смещения, поэтому относительный доступ к статическим переменным не зависит, поскольку доступ через GOT работает нормально. –

Смежные вопросы