Таблица технологических связей и глобальная таблица смещений - PullRequest
11 голосов
/ 13 марта 2012

Я читаю эту статью о PLT (Таблица связей процессов) и GOT (Глобальная таблица смещений) . В то время как цель PLT мне ясна, я все еще запутался в GOT. Из статьи я понял, что GOT необходим только для переменных, объявленных как extern в общей библиотеке. Для глобальных переменных, объявленных как static в коде общей библиотеки, это не требуется.

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

1 Ответ

18 голосов
/ 13 марта 2012

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

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

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

...