Ya leí la página de gcc
manual, pero todavía no puedo entender la diferencia entre -fpic
y -fPIC
. ¿Alguien puede explicarlo, de una manera muy sencilla y clara?
Preguntas relacionadas:
Ya leí la página de gcc
manual, pero todavía no puedo entender la diferencia entre -fpic
y -fPIC
. ¿Alguien puede explicarlo, de una manera muy sencilla y clara?
Preguntas relacionadas:
Respuestas:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Utilice -fPIC
o -fpic
para generar código independiente de la posición. El uso -fPIC
o la -fpic
generación de código independiente de la posición depende del objetivo. La -fPIC
elecció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 -fpic
opció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.
-fPIC
y -fpic
parece haber generado el mismo código. Parece que generan un código diferente solo en m68k, PowerPC y SPARC.
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.
man gcc
pero síinfo gcc
, que tiene más documentación.