Почему бы не всегда использовать fpic (Position Independent Code)?

Я прочитал это разместить на ПОС, и кажется, что это всегда хорошо использовать ПИК (всякий раз, когда это ех/статическую/долю llibrary).

Итак, каковы недостатки?
Существуют ли примеры разработки, когда не использовать ПОС?

Ответы

Ответ 1

Принятый ответ в связанном вопросе очень упрощен и только вызывает одну вещь, которая отличается между ПОС и кодом, отличным от ПИК, генерированием прыжков, которые являются относительными, а не абсолютными.

Когда вы создаете код PIC, это не только код, который позиционируется независимо, но и данные. И не весь код или данные могут быть устранены просто с использованием относительных смещений, он должен быть разрешен при загрузке (когда библиотека/программа загружается в память) или даже во время выполнения.

Кроме того, использование относительной адресации означает, что ЦП должен переводить относительные смещения в абсолютные адреса, а не выполнять компилятор.

В системе с виртуальной памятью часто нет необходимости тратить нагрузку или время выполнения на эти относительные разрешения адресов, когда компилятор может сделать это раз и навсегда.

Ответ 2

На некоторых архитектурах, включая x86, -fPIC генерируется гораздо худший код (т.е. вызов функции) для загрузки/хранения данных. Хотя это допустимо для библиотек, это нежелательно для исполняемых файлов.

Одной из основных точек продажи набора инструкций amd64 (а также недавнего gnu-x32 ABI) было добавление инструкций "Загрузка/сохранение ПК", которые решают проблему эффективности.

Обратите внимание, что закаленные системы обычно включают -fPIE для всех исполняемых файлов, поскольку это позволяет случайным образом размещать макет адресного пространства.