Почему бы не всегда использовать fpic (Position Independent Code)?
Я прочитал это разместить на ПОС, и кажется, что это всегда хорошо использовать ПИК (всякий раз, когда это ех/статическую/долю llibrary).
Итак, каковы недостатки?
Существуют ли примеры разработки, когда не использовать ПОС?
Ответ 1
Принятый ответ в связанном вопросе очень упрощен и только вызывает одну вещь, которая отличается между ПОС и кодом, отличным от ПИК, генерированием прыжков, которые являются относительными, а не абсолютными.
Когда вы создаете код PIC, это не только код, который позиционируется независимо, но и данные. И не весь код или данные могут быть устранены просто с использованием относительных смещений, он должен быть разрешен при загрузке (когда библиотека/программа загружается в память) или даже во время выполнения.
Кроме того, использование относительной адресации означает, что ЦП должен переводить относительные смещения в абсолютные адреса, а не выполнять компилятор.
В системе с виртуальной памятью часто нет необходимости тратить нагрузку или время выполнения на эти относительные разрешения адресов, когда компилятор может сделать это раз и навсегда.
Ответ 2
На некоторых архитектурах, включая x86, -fPIC генерируется гораздо худший код (т.е. вызов функции) для загрузки/хранения данных. Хотя это допустимо для библиотек, это нежелательно для исполняемых файлов.
Одной из основных точек продажи набора инструкций amd64 (а также недавнего gnu-x32 ABI) было добавление инструкций "Загрузка/сохранение ПК", которые решают проблему эффективности.
Обратите внимание, что закаленные системы обычно включают -fPIE для всех исполняемых файлов, поскольку это позволяет случайным образом размещать макет адресного пространства.