Qual é a diferença entre os parâmetros gcc `-fpic` e` -fPIC`?


96

Já li a página de gccmanual, mas ainda não consigo entender a diferença entre -fpice -fPIC. Alguém pode explicar de uma forma muito simples e clara?


Perguntas relacionadas:


1
Sim, a resposta não está em, man gccmas em info gcc, que tem mais documentação.
user2284570

Respostas:


109

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

Use -fPICou -fpicpara gerar código independente de posição. O uso -fPICou -fpicgeração de código independente de posição depende do destino. A -fPICescolha 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 -fpicopçã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.


33
E mais: fiz uma pequena experiência aqui (na plataforma x86_64) -fPICe -fpicparece ter gerado o mesmo código. Parece que eles geram um código diferente apenas em m68k, PowerPC e SPARC.
Denilson Sá Maia

3
Um único experimento com uma versão do gcc compilado de uma maneira para algum destino. Considere esse resultado com cautela, espere que o resultado mude com o tempo, especialmente com uma ferramenta como o GCC.
old_timer

Posso fazer uma pergunta; o que significam os símbolos globalmente visíveis ?
Константин Ван

17

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.

A página de manual vinculada foi atualizada, lembre-se de verificar.
youfu
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.