Що означає -fPIC під час створення спільної бібліотеки?


109

Я знаю, що -fPICваріант ' ' має щось спільне з вирішенням адрес та незалежністю між окремими модулями, але я не впевнений, що це насправді означає. Ти можеш пояснити?


1
Також, якщо ви хочете дізнатися детальніше, тут є чудова стаття ( akkadia.org/drepper/dsohowto.pdf )
MJ

Відповіді:


61

PIC означає Позиція Незалежний Код

і цитувати man gcc:

Якщо підтримується цільова машина, випромінюйте незалежний від позиції код, придатний для динамічного зв’язку та уникнення будь-яких обмежень щодо розміру глобальної таблиці зміщення. Цей параметр значно впливає на m68k, PowerPC та SPARC. Незалежний від позиції код вимагає спеціальної підтримки, а тому працює лише на певних машинах.

використовувати це під час побудови спільних об'єктів (* .so) на згаданих архітектурах.


1
f нічого не означає, це лише частина назви опції.
Зіфре

17
Існує різниця між fpic та fPIC. Вони обидва роблять те саме, але fpic використовує коротший відносний зсув, коли це можливо. Таким чином, компіляція з fpic може потенційно створювати менші файли. На жаль, це не завжди працює так, як очікувалося, тому використовуйте fPIC. Також зверніть увагу, що не всі процесори підтримують більш короткі компенсації, тому це може не змінити значення.
Мартін Йорк

2
'F' - це похмілля з того, як gcc обробляв аргументи командного рядка (це було пару років тому, і вони змінили цю частину коду, яку я недавно не шукав). Але в той час в різних умовах були дозволені лише певні букви або комбінації (була дуже складна мова для визначення аргументів командного рядка), в результаті "f" було використано для полегшення визначення аргументу командного рядка.
Мартін Йорк

2
Що буде, якщо побудувати * .so без fPIC?
Іса А

2
@IsaA Я сьогодні компілював функцію c-api mysql з джерела, і вона не будуватиметься, я отримала /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 і вона побудована.
chiliНУ

32

The fЄ ПКУ префікс для опцій , які «керують умовності інтерфейсу , використовуваних в генерації коду»

Поняття PIC"Код незалежності від позиції", це спеціалізаціяfpic для m68K та SPARC.

Редагувати: Прочитавши сторінку 11 документа, на який посилається 0x6adb015 , і коментар coryan, я вніс кілька змін:

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

Інакше без цієї опції навантажувач повинен був би змінити всі компенсації.

Зайве говорити, що ми майже завжди використовуємо -fpic / PIC.


1
Я думав, що ОС може вільно завантажувати бібліотеку в будь-яку віртуальну адресу, але без pic / PIC завантажувач повинен змінити код і відрегулювати всі абсолютні стрибки + непрямі до фактичного розташування процедур / бібліотек. З pic / PIC код не змінюється, і таким чином він дійсно ділиться в декількох процесах.
кориан

Кілька процесів багато в чому збігаються - ключовим моментом є те, що код можна завантажувати в будь-яку віртуальну адресу з абсолютним мінімумом виправлення адреси.
Джонатан Леффлер

16

man gcc каже:

-фікп
  Створіть незалежний від позиції код (PIC), придатний для використання в спільному доступі
  бібліотека, якщо вона підтримується для цільової машини. Такий код отримує доступ до всіх
  постійні адреси через глобальну таблицю зміщення (GOT). Динамічний
  завантажувач вирішує записи GOT при запуску програми (динамічний
  навантажувач не входить до складу GCC; це частина операційної системи). Якщо
  розмір GOT для пов’язаного виконуваного файлу перевищує конкретний для машини
  максимальний розмір, ви отримуєте повідомлення про помилку із вказувачем
  що -fpic не працює; у цьому випадку перекомпілюйте замість -fPIC.
  (Ці максимуми складають 8 к у SPARC та 32 к у m68k та RS / 6000.
  386 не має такого обмеження.)

  Незалежний від позиції код вимагає спеціальної підтримки, а отже
  працює лише на певних машинах. Для 386 GCC підтримує PIC для
  Система V, але не для Сонця 386i. Код, згенерований для
  IBM RS / 6000 завжди не залежить від позиції.

-fPIC
  Якщо це підтримується для цільової машини, випустіть незалежний від позиції код,
  підходить для динамічного зв'язку та уникнення будь-яких обмежень щодо розміру
  глобальна таблиця компенсацій. Цей параметр змінює значення на m68k
  і SPARC.

  Незалежний від позиції код вимагає спеціальної підтримки, а отже
  працює лише на певних машинах.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.