Я уже читал gcc
справочную страницу, но до сих пор не могу понять разницу между -fpic
и -fPIC
. Может ли кто-нибудь объяснить это очень просто и понятно?
Связанные вопросы:
Я уже читал gcc
справочную страницу, но до сих пор не могу понять разницу между -fpic
и -fPIC
. Может ли кто-нибудь объяснить это очень просто и понятно?
Связанные вопросы:
Ответы:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Используйте -fPIC
или -fpic
для создания независимого от позиции кода. Использование -fPIC
или -fpic
создание независимого от позиции кода зависит от цели. Этот -fPIC
выбор всегда работает, но может создать код большего размера, чем -fpic
(следует помнить, что PIC имеет больший размер, поэтому он может создавать большие объемы кода). Использование -fpic
опции обычно генерирует меньший и более быстрый код, но будет иметь ограничения, зависящие от платформы, такие как количество глобально видимых символов или размер кода. Компоновщик скажет вам, подходит ли он, когда вы создадите общую библиотеку. Если есть сомнения, я выбираю -fPIC
, потому что это всегда работает.
-fPIC
и, -fpic
похоже, сгенерировал тот же код. Похоже они генерируют другой код только на m68k, PowerPC и SPARC.
При генерации кода для разделяемых библиотек -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.
man gcc
а внутриinfo gcc
, где больше документации.