Eu sei que a -fPIC
opção ' ' tem algo a ver com a resolução de endereços e independência entre módulos individuais, mas não tenho certeza do que realmente significa. Você pode explicar?
Eu sei que a -fPIC
opção ' ' tem algo a ver com a resolução de endereços e independência entre módulos individuais, mas não tenho certeza do que realmente significa. Você pode explicar?
Respostas:
PIC significa Código Independente de Posição
e para citar man gcc
:
Se houver suporte para a máquina de destino, emita código independente de posição, adequado para vinculação dinâmica e evitando qualquer limite no tamanho da tabela de deslocamento global. Esta opção faz a diferença no m68k, PowerPC e SPARC. O código independente de posição requer suporte especial e, portanto, funciona apenas em certas máquinas.
use isto ao construir objetos compartilhados (* .so) nas arquiteturas mencionadas.
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
compilava, então adicionei o fPIC e ele foi compilado.
o f
é o prefixo gcc para opções que "controlam as convenções de interface usadas na geração de código"
A PIC
sigla para "Código Independente de Posição", é uma especialização dofpic
para m68K e SPARC.
Edit: Depois de ler a página 11 do documento referenciado por 0x6adb015 e o comentário de coryan, fiz algumas alterações:
Essa opção só faz sentido para bibliotecas compartilhadas e você está informando ao sistema operacional que está usando uma tabela de deslocamento global, GOT. Isso significa que todas as suas referências de endereço são relativas ao GOT e o código pode ser compartilhado em vários processos.
Caso contrário, sem esta opção, o carregador teria que modificar ele mesmo todos os deslocamentos.
Desnecessário dizer que quase sempre usamos -fpic / PIC.
man gcc
diz:
-fpic Gerar código independente de posição (PIC) adequado para uso em um compartilhamento biblioteca, se compatível com a máquina de destino. Esse código acessa todos endereços constantes por meio de uma tabela de deslocamento global (GOT). A dinamica carregador resolve as entradas GOT quando o programa é iniciado (a dinâmica loader não faz parte do GCC; faz parte do sistema operacional). E se o tamanho do GOT para o executável vinculado excede um específico da máquina tamanho máximo, você receberá uma mensagem de erro do vinculador indicando que -fpic não funciona; nesse caso, recompile com -fPIC. (Esses máximos são 8k no SPARC e 32k no m68k e RS / 6000. O 386 não tem esse limite.) O código independente de posição requer suporte especial e, portanto, funciona apenas em certas máquinas. Para o 386, GCC suporta PIC para System V, mas não para o Sun 386i. Código gerado para o O IBM RS / 6000 é sempre independente da posição. -fPIC Se compatível com a máquina alvo, emite código independente de posição, adequado para link dinâmico e evitando qualquer limite no tamanho de a tabela de deslocamento global. Esta opção faz a diferença no m68k e o SPARC. O código independente de posição requer suporte especial e, portanto, funciona apenas em certas máquinas.