Ho già letto la gcc
manpage, ma ancora non riesco a capire la differenza tra -fpic
e -fPIC
. Qualcuno può spiegarlo, in modo molto semplice e chiaro?
Domande correlate:
Ho già letto la gcc
manpage, ma ancora non riesco a capire la differenza tra -fpic
e -fPIC
. Qualcuno può spiegarlo, in modo molto semplice e chiaro?
Domande correlate:
Risposte:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Utilizzare -fPIC
o -fpic
per generare codice indipendente dalla posizione. L'utilizzo -fPIC
o la -fpic
generazione di codice indipendente dalla posizione dipende dalla destinazione. La -fPIC
scelta funziona sempre, ma può produrre codice più grande di -fpic
(mnenomic per ricordare questo è che PIC è in un caso più grande, quindi potrebbe produrre quantità maggiori di codice). L'utilizzo di -fpic
option generalmente genera codice più piccolo e più veloce, ma avrà limitazioni dipendenti dalla piattaforma, come il numero di simboli visibili globalmente o la dimensione del codice. Il linker ti dirà se si adatta quando crei la libreria condivisa. In caso di dubbio, scelgo -fPIC
, perché funziona sempre.
-fPIC
e -fpic
sembra che abbia generato lo stesso codice. Sembra che generino un codice diverso solo su m68k, PowerPC e SPARC.
Dalla pagina del manuale di Gcc :
Quando si genera codice per librerie condivise, -fpic implica -msmall-data e -fPIC implica -mlarge-data.
Dove:
-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
ma dentroinfo gcc
, che hanno più documentazione.