Яка різниця між параметрами `-fpic` та` -fPIC` gcc?


96

Я вже прочитав сторінку gcc, але досі не можу зрозуміти різницю між -fpicі -fPIC. Чи може хтось пояснити це дуже простим і зрозумілим способом?


Пов’язані запитання:


1
Так, відповідь не в, man gccа в тому info gcc, в якому є більше документації.
користувач2284570

Відповіді:


109

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Використовуйте -fPICабо -fpicдля створення коду, незалежного від позиції. Від того, використовувати -fPICчи -fpicгенерувати незалежний від позиції код, залежить від цілі -fPICВибір завжди працює, але може виробляти більше коду , ніж -fpic(mnenomic пам'ятати це , що ПІК в більшому випадку, так що він може виробляти великі обсяги коду). Використання -fpicопції зазвичай генерує менший та швидший код, але матиме обмеження, залежні від платформи, такі як кількість глобально видимих ​​символів або розмір коду. Лінкер повідомить, чи підходить він під час створення спільної бібліотеки. Коли ви сумніваєтесь, я вибираю -fPIC, бо це завжди працює.


33
Більше того: я тут трохи експериментував (на платформі x86_64) -fPICі, -fpicсхоже, створив той самий код. Здається, вони генерують інший код лише на m68k, PowerPC та SPARC.
Denilson Sá Maia

3
Один експеримент з однією версією gcc, складеним одним способом для якоїсь цілі. Отримайте цей результат із зерном солі, очікуйте, що результат з часом зміниться, зокрема, за допомогою інструменту типу GCC.
old_timer

Чи можу я задати питання; що означають глобально видимі символи ?
Константин Ван

17

На сторінці керівництва Gcc :

Під час генерації коду для спільних бібліотек -fpic має на увазі -msmall-data та -fPIC має на увазі -mlarge-data.

Де:

 -msmall-data
 -mlarge-data
       When -mexplicit-relocs is in effect, static data is accessed via
       gp-relative relocations.  When -msmall-data is used, objects 8
       bytes long or smaller are placed in a small data area (the
       ".sdata" and ".sbss" sections) and are accessed via 16-bit
       relocations off of the $gp register.  This limits the size of the
       small data area to 64KB, but allows the variables to be directly
       accessed via a single instruction.

       The default is -mlarge-data.  With this option the data area is
       limited to just below 2GB.  Programs that require more than 2GB
       of data must use "malloc" or "mmap" to allocate the data in the
       heap instead of in the program's data segment.

       When generating code for shared libraries, -fpic implies
       -msmall-data and -fPIC implies -mlarge-data.

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