Já li a página de gcc
manual, mas ainda não consigo entender a diferença entre -fpic
e -fPIC
. Alguém pode explicar de uma forma muito simples e clara?
Perguntas relacionadas:
Já li a página de gcc
manual, mas ainda não consigo entender a diferença entre -fpic
e -fPIC
. Alguém pode explicar de uma forma muito simples e clara?
Perguntas relacionadas:
Respostas:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Use -fPIC
ou -fpic
para gerar código independente de posição. O uso -fPIC
ou -fpic
geração de código independente de posição depende do destino. A -fPIC
escolha sempre funciona, mas pode produzir código maior do que -fpic
(mnenômico para lembrar isso é que o PIC está em um caso maior, portanto, pode produzir grandes quantidades de código). Usar -fpic
opção geralmente gera código menor e mais rápido, mas terá limitações dependentes da plataforma, como o número de símbolos visíveis globalmente ou o tamanho do código. O vinculador dirá se ele se encaixa quando você cria a biblioteca compartilhada. Na dúvida, eu escolho -fPIC
, porque sempre dá certo.
-fPIC
e -fpic
parece ter gerado o mesmo código. Parece que eles geram um código diferente apenas em m68k, PowerPC e SPARC.
Na página de manual do Gcc :
Ao gerar código para bibliotecas compartilhadas, -fpic implica em -msmall-data e -fPIC implica em -mlarge-data.
Onde:
-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
mas eminfo gcc
, que tem mais documentação.