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


109

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


1
Также, если вы хотите узнать более подробно, здесь есть отличная статья ( akkadia.org/drepper/dsohowto.pdf )
MJ

Ответы:


61

PIC расшифровывается как Position Independent Code

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

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

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


1
f ничего не значит, это просто часть имени опции.
Zifre

17
Есть разница между fpic и fPIC. Они оба делают одно и то же, но fpic использует более короткое относительное смещение, если это возможно. Таким образом, компиляция с помощью fpic может потенциально создавать файлы меньшего размера. К сожалению, это не всегда работает должным образом, поэтому используйте fPIC. Также обратите внимание, что не все процессоры поддерживают более короткие смещения, поэтому это может не иметь значения.
Мартин Йорк

2
'F' - это пережиток того, как gcc обрабатывал аргументы командной строки (это было пару лет назад, и они изменили эту часть кода, которую я недавно не просматривал). Но в то время только определенные буквы или комбинации были разрешены при различных условиях (существовал очень сложный язык для определения аргументов командной строки), в результате использовалась буква «f», чтобы упростить определение в качестве аргумента командной строки.
Мартин Йорк

2
Что будет, если построить * .so без fPIC?
Isa A

2
@IsaA Сегодня я компилировал функцию mysql c-api из исходного кода, и она не /usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPICсобиралась , я получил, поэтому я добавил fPIC, и она построена.
chiliNUT

32

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

Это PICозначает «позиционно-независимый код», это специализация fpicдля m68K и SPARC.

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

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

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

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


1
Я думал, что ОС может загружать библиотеку по любому виртуальному адресу, но без pic / PIC загрузчик должен модифицировать код и настраивать все абсолютные переходы + косвенные ссылки на фактическое расположение подпрограмм / библиотек. При использовании pic / PIC код не изменяется, и поэтому он действительно используется несколькими процессами.
coryan

Множественные процессы в значительной степени случайны - их ключевым моментом является то, что код может быть загружен по любому виртуальному адресу с абсолютным минимумом исправлений адреса.
Джонатан Леффлер,

16

man gcc говорит:

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

  Позиционно-независимый код требует специальной поддержки, поэтому
  работает только на определенных машинах. Для 386 GCC поддерживает PIC для
  System V, но не для Sun 386i. Код, созданный для
  IBM RS / 6000 всегда не зависит от позиции.

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

  Позиционно-независимый код требует специальной поддержки, поэтому
  работает только на определенных машинах.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.