Я вже прочитав сторінку gcc
, але досі не можу зрозуміти різницю між -fpic
і -fPIC
. Чи може хтось пояснити це дуже простим і зрозумілим способом?
Пов’язані запитання:
Я вже прочитав сторінку gcc
, але досі не можу зрозуміти різницю між -fpic
і -fPIC
. Чи може хтось пояснити це дуже простим і зрозумілим способом?
Пов’язані запитання:
Відповіді:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Використовуйте -fPIC
або -fpic
для створення коду, незалежного від позиції. Від того, використовувати -fPIC
чи -fpic
генерувати незалежний від позиції код, залежить від цілі -fPIC
Вибір завжди працює, але може виробляти більше коду , ніж -fpic
(mnenomic пам'ятати це , що ПІК в більшому випадку, так що він може виробляти великі обсяги коду). Використання -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
, в якому є більше документації.