Что означает -fPIC при создании разделяемой библиотеки?

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

3 ответа

Решение

PIC расшифровывается как независимый от позиции код

и процитировать man gcc:

Если поддерживается для целевого компьютера, генерировать независимый от позиции код, подходящий для динамического связывания и избегающий любых ограничений размера таблицы глобальных смещений. Этот параметр имеет значение для M68K, PowerPC и SPARC. Независимый от позиции код требует специальной поддержки и поэтому работает только на определенных машинах.

используйте это при построении общих объектов (*.so) на упомянутых архитектурах.

f это префикс gcc для опций, которые "управляют соглашениями об интерфейсе, используемыми при генерации кода"

PIC расшифровывается как "Независимый от позиции код", это специализация fpic для m68K и SPARC.

Изменить: После прочтения 11-й страницы документа, на который ссылается 0x6adb015, и комментария Кориана, я сделал несколько изменений:

Эта опция имеет смысл только для разделяемых библиотек, и вы сообщаете ОС, что используете глобальную таблицу смещений GOT. Это означает, что все ваши адреса адресов относятся к GOT, и код может быть разделен между несколькими процессами.

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

Излишне говорить, что мы почти всегда используем -fpic/PIC.

man gcc говорит:

-fpic Создать независимый от позиции код (PIC), подходящий для использования в общей библиотеке, если поддерживается для целевой машины. Такой код обращается ко всем постоянным адресам через глобальную таблицу смещений (GOT). Динамический загрузчик разрешает записи GOT при запуске программы (динамический загрузчик не является частью GCC; он является частью операционной системы). Если размер GOT для связанного исполняемого файла превышает максимальный размер для конкретной машины, вы получите сообщение об ошибке от компоновщика, указывающее, что -fpic не работает; в этом случае перекомпилируйте вместо него -fPIC.
  (Эти максимумы составляют 8 000 для SPARC и 32 000 для m68k и RS/6000. У 386 такого ограничения нет.) Независимый от позиции код требует специальной поддержки и поэтому работает только на определенных машинах. Для 386 GCC поддерживает PIC для System V, но не для Sun 386i. Код, сгенерированный для IBM RS/6000, всегда не зависит от позиции.

-fPIC Если поддерживается для целевого компьютера, генерировать независимый от позиции код, подходящий для динамического связывания и избегающий любых ограничений размера глобальной таблицы смещений. Этот параметр имеет значение для M68K и SPARC. Независимый от позиции код требует специальной поддержки и поэтому работает только на определенных машинах.
Другие вопросы по тегам