¿Cuál es la diferencia entre los parámetros gcc `-fpic` y` -fPIC`?

96

Ya leí la página de gccmanual, pero todavía no puedo entender la diferencia entre -fpicy -fPIC. ¿Alguien puede explicarlo, de una manera muy sencilla y clara?


Preguntas relacionadas:

Denilson Sá Maia
fuente
1
Sí, la respuesta no está en man gccpero sí info gcc, que tiene más documentación.
user2284570

Respuestas:

110

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

Utilice -fPICo -fpicpara generar código independiente de la posición. El uso -fPICo la -fpicgeneración de código independiente de la posición depende del objetivo. La -fPICelección siempre funciona, pero puede producir un código más grande que -fpic(mnenómico recordar esto es que PIC está en un caso más grande, por lo que puede producir grandes cantidades de código). El uso de la -fpicopción generalmente genera un código más pequeño y más rápido, pero tendrá limitaciones dependientes de la plataforma, como la cantidad de símbolos visibles globalmente o el tamaño del código. El vinculador le dirá si encaja cuando cree la biblioteca compartida. En caso de duda, elijo -fPIC, porque siempre funciona.

Anycorn
fuente
33
Es más: hice un pequeño experimento aquí (en la plataforma x86_64) -fPICy -fpicparece haber generado el mismo código. Parece que generan un código diferente solo en m68k, PowerPC y SPARC.
Denilson Sá Maia
4
Un único experimento con una versión de gcc compilada de una forma 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.
old_timer
Puedo hacer una pregunta; ¿Qué significan los símbolos globalmente visibles ?
Константин Ван
17

Desde la página del manual de Gcc :

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

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.

       When generating code for shared libraries, -fpic implies
       -msmall-data and -fPIC implies -mlarge-data.
Alexandro de Oliveira
fuente
1
La página del manual vinculada se ha actualizado, recuerde revisar.
youfu