2013-12-10 4 views
10

Мне любопытно, почему существует таблица сравнения процедур. Какой цели это служит? Не может ли сборка напрямую вызвать таблицу глобальных смещений? Какое преимущество вызывает вызов PLT по вызову глобальной таблицы смещений?Какова цель таблицы связей процедуры?

Весь процесс по-прежнему смущает меня, и я пытаюсь выяснить динамические связи внутри и снаружи, поэтому любая помощь будет оценена по достоинству.

+0

Возможный дубликат [Таблица связывания процессов и Глобальная таблица смещений] (http://stackoverflow.com/questions/9688076/process-linkage-table-and-global-offset-table) –

+1

Этот вопрос не отвечает на мой вопрос на всех – Rell3oT

ответ

9

Для звонков, сделанных из кода ПОС, вы правы, что PLT действительно не нужен. Компилятор мог просто генерировать GOT-поиск и косвенный вызов адреса, полученного из GOT. Использование PLT имеет тенденцию делать код немного более эффективным, хотя (по крайней мере, меньший размер раздувания за вызов), поэтому он обычно используется в любом случае.

Где PLT абсолютно необходимо, однако, находится в коде, отличном от PIC, который связан динамически. (Обычно это происходит только в основной программе, а на многих арках код не-PIC даже не разрешен/поддерживается в общих библиотеках.) Когда компилятор генерирует не-PIC-код для вызова функции, он не знает, что фактический адрес назначения будет динамически решен во время выполнения через GOT. Таким образом, он просто генерирует обычную команду вызова. Тогда компоновщик отвечает, когда он видит перемещение типа вызова для символа, который не разрешен локально, и для которого требуется компоновка времени выполнения, для генерации записи PLT, которая загружает адрес из GOT и совершает косвенный переход к нему. Таким образом, исходный код вызова функции не-PIC работает без изменений.

+0

Отлично! Один последний вопрос. Что бы GOT пришлось делать по-разному в коде PIC, если PLT не было? В частности ... Почему это было бы более раздутым? – Rell3oT

+0

До тех пор, пока он проходит через PLT, вызов из кода PIC обычно выглядит идентичным вызову из кода, отличного от PIC, то есть отдельной команды вызова PC-relative. (Возможно, у него есть дополнительные требования, которые уже загружены регистром GOT, но это зависит от архитектуры.) Вызов через GOT без использования PLT будет таким же, как вставка кода, который обычно находится в записи PLT, что обычно 2-3 инструкции для загрузки фактического адреса функции и перехода к нему. –

+0

Хорошо, вот что я понял. Я предполагаю, что большая часть будет довольно существенной в случае, когда вызывается много разных функций, поэтому приятно иметь два разных «уровня» вызовов для лучшего понимания. спасибо вам – Rell3oT

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