Qual è la differenza tra i parametri gcc `-fpic` e` -fPIC`?


96

Ho già letto la gccmanpage, ma ancora non riesco a capire la differenza tra -fpice -fPIC. Qualcuno può spiegarlo, in modo molto semplice e chiaro?


Domande correlate:


1
Sì, la risposta non è dentro man gccma dentro info gcc, che hanno più documentazione.
user2284570

Risposte:


109

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

Utilizzare -fPICo -fpicper generare codice indipendente dalla posizione. L'utilizzo -fPICo la -fpicgenerazione di codice indipendente dalla posizione dipende dalla destinazione. La -fPICscelta 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 -fpicoption 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.


33
Inoltre: ho fatto un piccolo esperimento qui (su piattaforma x86_64) -fPICe -fpicsembra che abbia generato lo stesso codice. Sembra che generino un codice diverso solo su m68k, PowerPC e SPARC.
Denilson Sá Maia

3
Un singolo esperimento con una versione di gcc compilato in un modo per qualche target. Prendi quel risultato con le pinze, aspettati che quel risultato cambi nel tempo in particolare con uno strumento come GCC.
old_timer

Posso fare una domanda; cosa significano i simboli visibili a livello globale ?
Константин Ван

17

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.

La pagina di manuale collegata è stata aggiornata, ricordati di controllare.
youfu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.