Bibliotecas compartilhadas ELF - motivação para o PLT

10

O código de autodetecção pode ser usado para acelerar a chamada de função em bibliotecas vinculadas dinamicamente?

Até onde eu sei, as bibliotecas compartilhadas ELF usam uma espécie de tabela de salto indireta (a conexão de procedimento tabela, ou PLT) para permitir a ligação lenta de funções de biblioteca. O objetivo parece ser evitar a necessidade de modificar a tabela no segmento de código enquanto ainda permite a resolução lenta de posições de função na primeira chamada.

Não seria mais rápido criar dinamicamente o código para essa tabela no momento do carregamento ou, possivelmente, até mesmo na primeira chamada de função?

É para permitir o compartilhamento do segmento de código entre processos, tanto quanto possível (uma tabela dinâmica seria privada para um processo)? É por razões de segurança (o código gravável não deve ser executável - mas os JITs fazem isso o tempo todo, e a permissão de escrita poderia ser adicionado e removido pelo carregador antes de realmente iniciar o programa)?

Ou é uma combinação desses, e o pequeno ganho de desempenho por chamada de função não valeria o esforço?

    
por lxgr 15.11.2012 / 19:54

2 respostas

7

Suponho que estamos falando de arquitetura x86.

Você não pode ter o Código de Auto-modificação no modo protegido , que é usado pela maioria dos sistemas operacionais baseados em UNIX (e não só) que eu estou ciente, porque os segmentos de código são sempre somente leitura. Um carregador não controla isso - é algo que está sendo tratado pelo subsistema de gerenciamento de memória do kernel.

Mas mesmo se você pudesse "criar o código para essa tabela no momento do carregamento", como você diz, isso desafiaria todo o propósito das bibliotecas compartilhadas. Dessa forma, cada processo teria uma cópia "privada" das funções da biblioteca em seu espaço de endereço, aumentando efetivamente o espaço ocupado pela memória - uma das razões pelas quais as bibliotecas compartilhadas foram criadas, para resolver esse problema.

O processo inteiro que você descreve é bastante complexo, e custaria mais ciclos de processamento do que o método PLT usado hoje em dia, e provavelmente introduziria mais, novos & questões de segurança interessantes.

    
por 15.11.2012 / 20:44
1

ELF DSOs podem usar um sinalizador (DF_TEXREL) para anunciar que precisam de relocações por modificação de sua seção de texto (que normalmente é somente leitura). A abordagem da tabela de salto, juntamente com o código independente da posição PIE, deve ser mais ideal, no entanto.

(Encontrado no link , mas outros recursos mencionam isso também)

    
por 17.04.2016 / 22:00