2010-08-23 18 views
74

Ho già letto la manpage gcc, ma non riesco ancora a capire la differenza tra -fpic e -fPIC. Qualcuno può spiegarlo, in modo molto semplice e chiaro?Qual è la differenza tra i parametri `-fpic` e` -fPIC` gcc?


domande correlate:

+1

Sì, la risposta non è in 'uomo gcc'but in' informazioni gcc', che hanno più documentazione. – user2284570

risposta

90

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

Usa -fPIC o -fpic per generare posizione codice dipendente. Se utilizzare -fPIC o -fpic per generare un codice indipendente dalla posizione è dipendente dalla destinazione. La scelta -fPIC funziona sempre, ma può produrre un codice più grande di -fpic (mnenomic per ricordare che il PIC è in un caso più grande, quindi potrebbe produrre quantità maggiori di codice). L'utilizzo dell'opzione -fpic di solito genera un codice più piccolo e più veloce, ma presenta limitazioni dipendenti dalla piattaforma, come il numero di simboli globalmente visibili 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.

+31

Inoltre: ho fatto un piccolo esperimento qui (sulla piattaforma x86_64), '-fPIC' e' -fpic' sembra aver generato lo stesso codice. Sembra che generino un codice diverso solo su m68k, PowerPC e SPARC. –

+1

Un singolo esperimento con una versione di gcc compilata in un modo per alcuni target. Prendi questo risultato con un pizzico di sale, aspettati che il risultato cambi nel corso del tempo, in particolare con uno strumento come GCC. –

+0

Posso fare una domanda; cosa significa _ simboli globalmente visibili_? –

7

Dal Gcc manual page:

Quando la generazione di codice per le librerie condivise, -fpic implica -msmall-data e -fPIC implica -mlarge-dati.

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. 
Problemi correlati