Для звонков, сделанных из кода ПОС, вы правы, что PLT действительно не нужен. Компилятор мог просто генерировать GOT-поиск и косвенный вызов адреса, полученного из GOT. Использование PLT имеет тенденцию делать код немного более эффективным, хотя (по крайней мере, меньший размер раздувания за вызов), поэтому он обычно используется в любом случае.
Где PLT абсолютно необходимо, однако, находится в коде, отличном от PIC, который связан динамически. (Обычно это происходит только в основной программе, а на многих арках код не-PIC даже не разрешен/поддерживается в общих библиотеках.) Когда компилятор генерирует не-PIC-код для вызова функции, он не знает, что фактический адрес назначения будет динамически решен во время выполнения через GOT. Таким образом, он просто генерирует обычную команду вызова. Тогда компоновщик отвечает, когда он видит перемещение типа вызова для символа, который не разрешен локально, и для которого требуется компоновка времени выполнения, для генерации записи PLT, которая загружает адрес из GOT и совершает косвенный переход к нему. Таким образом, исходный код вызова функции не-PIC работает без изменений.
Возможный дубликат [Таблица связывания процессов и Глобальная таблица смещений] (http://stackoverflow.com/questions/9688076/process-linkage-table-and-global-offset-table) –
Этот вопрос не отвечает на мой вопрос на всех – Rell3oT