2010-08-23 5 views
74

Ya leí la página de manual gcc, pero sigo sin entender la diferencia entre -fpic y -fPIC. ¿Alguien puede explicarlo, de una manera muy simple y clara?¿Cuál es la diferencia entre los parámetros `-fpic` y` -fPIC` gcc?


preguntas relacionadas:

+1

Si la respuesta es no en '' gcc'but hombre en gcc' información, que tiene más documentación. – user2284570

Respuesta

90

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

Uso -fPIC o -fpic para generar posición en código dependiente Si se usa -fPIC o -fpic para generar código independiente de posición depende del objetivo. La opción -fPIC siempre funciona, pero puede producir un código más grande que -fpic (mínimo para recordar que el PIC está en un caso más grande, por lo que puede producir cantidades mayores de código). El uso de la opción -fpic generalmente genera código más pequeño y más rápido, pero tendrá limitaciones dependientes de la plataforma, como el número de símbolos globalmente visibles o el tamaño del código. El vinculador le dirá si se ajusta cuando crea la biblioteca compartida. En caso de duda, elijo -fPIC, porque siempre funciona.

+31

Lo que es más: hice un pequeño experimento aquí (en la plataforma x86_64), '-fPIC' y' -fpic' parece haber generado el mismo código. Parece que generan un código diferente solo en m68k, PowerPC y SPARC. –

+1

Un único experimento con una versión de gcc compilada de una manera para algún objetivo. Tome ese resultado con un grano de sal, espere que el resultado cambie con el tiempo, en particular con una herramienta como GCC. –

+0

Puedo hacer una pregunta; ¿Qué significa 'símbolos globalmente visibles'? –

7

Desde el Gcc manual page:

Al generar código para bibliotecas compartidas, -fPIC implica -msmall-datos y -fPIC implica -mlarge-datos.

Dónde:

-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. 
Cuestiones relacionadas