В чем разница между параметрами gcc `-fpic` и` -fPIC`?

99

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


Связанные вопросы:

Денилсон Са Майя
источник
1
Да, ответ не внутри, man gccа внутри info gcc, где больше документации.
user2284570

Ответы:

114

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

Используйте -fPICили -fpicдля создания независимого от позиции кода. Использование -fPICили -fpicсоздание независимого от позиции кода зависит от цели. Этот -fPICвыбор всегда работает, но может создать код большего размера, чем -fpic(следует помнить, что PIC имеет больший размер, поэтому он может создавать большие объемы кода). Использование -fpicопции обычно генерирует меньший и более быстрый код, но будет иметь ограничения, зависящие от платформы, такие как количество глобально видимых символов или размер кода. Компоновщик скажет вам, подходит ли он, когда вы создадите общую библиотеку. Если есть сомнения, я выбираю -fPIC, потому что это всегда работает.

Anycorn
источник
35
Более того: я провел здесь небольшой эксперимент (на платформе x86_64) -fPICи, -fpicпохоже, сгенерировал тот же код. Похоже они генерируют другой код только на m68k, PowerPC и SPARC.
Denilson Sá Maia
4
Один эксперимент с одной версией gcc, скомпилированной одним способом для некоторой цели. Отнеситесь к этому результату с недоверием, ожидайте, что результат изменится со временем, особенно с помощью такого инструмента, как GCC.
old_timer 05
Могу я задать вопрос; что означают глобально видимые символы ?
Константин Ван
18

На странице руководства 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.
Александро де Оливейра
источник
1
Ссылка на страницу руководства была обновлена, не забудьте проверить.
youfu