O que -fPIC significa ao construir uma biblioteca compartilhada?


109

Eu sei que a -fPICopçã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?


1
Também no caso de você querer saber mais detalhadamente, há um ótimo artigo aqui ( akkadia.org/drepper/dsohowto.pdf )
MJ

Respostas:


61

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.


1
f não significa nada, é apenas parte do nome da opção.
Zifre

17
Há uma diferença entre fpic e fPIC. Ambos fazem a mesma coisa, mas o fpic usa um deslocamento relativo mais curto, quando disponível. Portanto, a compilação com o fpic pode potencialmente produzir arquivos menores. Infelizmente, nem sempre funciona como esperado, então use o fPIC. Observe também que nem todos os processadores suportam deslocamentos mais curtos, portanto, isso pode não fazer diferença.
Martin York

2
O 'f' é um resquício da maneira como o gcc manipulava os argumentos de linha de comando (isso foi há alguns anos e eles mudaram essa parte do código que não examinei recentemente). Mas na época apenas certas letras ou combinações eram permitidas sob diferentes condições (havia uma linguagem muito complexa para definir argumentos de linha de comando), como resultado, o 'f' foi usado para facilitar a definição como um argumento de linha de comando.
Martin York

2
O que acontecerá se alguém construir um * .so sem fPIC?
Isa A de

2
@IsaA Eu estava compilando uma função c-api mysql do código-fonte hoje e ela não /usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPICcompilava, então adicionei o fPIC e ele foi compilado.
chiliNUT

32

o f é o prefixo gcc para opções que "controlam as convenções de interface usadas na geração de código"

A PICsigla 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.


1
Achei que o sistema operacional estava livre para carregar a biblioteca em qualquer endereço virtual, mas sem pic / PIC o carregador tem que modificar o código e ajustar todos os saltos absolutos + indireções para os locais reais das rotinas / bibliotecas. Com pic / PIC, o código não é modificado e, portanto, é realmente compartilhado por vários processos.
Coryan

Vários processos são em grande parte coincidências - o ponto principal é que o código pode ser carregado em qualquer endereço virtual com um mínimo absoluto de ajustes de endereço.
Jonathan Leffler

16

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.
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.