Pergunta

Ao compilar as bibliotecas compartilhadas no gcc a opção -fPIC compila o código como posição independente. Existe alguma razão (performance ou não) porque você não compilar todos independentes posição do código?

Foi útil?

Solução

Ele adiciona um engano. Com código independente de posição que você tem que carregar o endereço de sua função e, em seguida, saltar para ele. Normalmente, o endereço da função já está presente no fluxo de instrução.

Outras dicas

Sim, existem motivos de desempenho. Alguns acessos são efetivamente sob outra camada de engano para obter a posição absoluta na memória.

Há também a GOT (Global compensar tabela) que armazena deslocamentos de variáveis ??globais. Para mim, isso parece apenas uma IAT correção da tabela, que é classificada como dependente de wikipedia e algumas outras fontes de posição.

http://en.wikipedia.org/wiki/Position_independent_code

Este artigo explica como PIC funciona e compara-a com a alternativa - tempo de carregamento deslocalização. Eu acho que é relevante para a sua pergunta.

Além da resposta aceita. Uma coisa que prejudica a performance do código PIC muito é a falta de "IP endereçamento relativo" em x86. Com "IP endereçamento relativo" que você poderia pedir os dados que são X bytes do ponteiro de instrução atual. Isto faria com que o código PIC muito mais simples.

Saltos e chamadas, são geralmente EIP relativa, de modo que aqueles realmente não representar um problema. No entanto, o acesso a dados vai exigir um pouco de artifícios extra. Às vezes, um registo será temporariamente reservado como um "ponteiro base" aos dados que o código exige. Por exemplo, uma técnica comum é abusar da forma como as chamadas de trabalho em x86:

call label_1
.dd 0xdeadbeef
.dd 0xfeedf00d
.dd 0x11223344
label_1:
pop ebp            ; now ebp holds the address of the first dataword
                   ; this works because the call pushes the **next**
                   ; instructions address
                   ; real code follows
mov eax, [ebp + 4] ; for example i'm accessing the '0xfeedf00d' in a PIC way

Esta e outras técnicas de adicionar uma camada de engano para os acessos de dados. Por exemplo, o GOT (Global compensar tabela) usado por compiladores gcc.

x86-64 adicionou um modo de "RIP relativo" que torna as coisas um muito simples.

Como a implementação posicionar completamente código independente acrescenta um constrangimento para o gerador de código que pode impedir o uso de operações mais rápidas, ou adicionar etapas extras para preservar essa restrição.

Isso pode ser uma troca aceitável para obter multiprocessamento, sem um sistema de memória virtual, onde você confia processos para não invadir a memória do outro e pode precisar carregar um aplicativo específico a qualquer endereço de base.

Em muitos sistemas modernos as desempenho trade-offs são diferentes, e um carregador de relocação é muitas vezes menos caro (custa qualquer código de tempo é carregado pela primeira vez) que o melhor um otimizador pode fazer se ele tem livre reinado. Além disso, a disponibilidade de espaços de endereços virtuais peles maioria da motivação para a independência posição em primeiro lugar.

Além disso, hardware virtual memória na maioria dos processadores modernos (utilizado pela maioria dos sistemas operacionais modernos) significa que um monte de código (todos os aplicativos do espaço do usuário, barrando o uso peculiar de mmap ou semelhantes) não precisa ser a posição independente. Cada programa recebe o seu próprio espaço de endereço que pensa começa em zero.

position-independent code tem uma sobrecarga de desempenho na maioria arquitetura, porque requer um registo extra.

Então, isso é para fins de desempenho.

sistema Hoje em dia operando e compilador por marca padrão todo o código como código independente de posição. Tente compilar sem o sinalizador -fPIC, o código irá compilar bem, mas você só vai ficar janelas como um warning.OS usar uma técnica chamada de mapeamento de memória para conseguir isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top