Bibliotecas compartilhadas do ELF - motivação para o PLT

11

O código de modificação automática pode ser usado para acelerar a chamada de funções em bibliotecas vinculadas dinamicamente?

Pelo que entendi, as bibliotecas compartilhadas ELF usam um tipo de tabela de salto indireto (a tabela de ligação de procedimento ou PLT) para permitir a ligação lenta de funções da biblioteca. O objetivo parece evitar a necessidade de modificar a tabela no segmento de código, enquanto ainda permite a resolução lenta das posições das funções na primeira chamada.

Não seria mais rápido criar dinamicamente o código para essa tabela no tempo de carregamento ou possivelmente até 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 motivos 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 gravação pode ser adicionada e removida pelo carregador antes de realmente iniciar o programa)?

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

lxgr
fonte

Respostas:

8

Suponho que estamos falando sobre arquitetura x86.

Você não pode ter o código de modificação automática no modo protegido , que é usado pela maioria dos sistemas operacionais baseados em UNIX (e não apenas) que eu conheço, 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 tempo de 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 sua área de cobertura de memória - um dos motivos pelos quais as bibliotecas compartilhadas foram criadas, foi para resolver esse problema.

Todo o processo que você descreve é ​​bastante complexo e custaria mais ciclos de processamento do que o método PLT usado atualmente e provavelmente introduziria mais, novos e interessantes problemas de segurança.

dkaragasidis
fonte
2
Você pode usar a chamada de sistema mprotect (2) para tornar as páginas do segmento .text graváveis ​​e executáveis.
Bruce Ediger
1
Está correto, senhor. Provavelmente funcionaria decentemente no sistema UNIX comum, mas todo o processo de vinculação seria interrompido assim que alguém tentasse proteger o sistema com, por exemplo, o PaX, o que impõe restrições ao mprotect (2).
Dkaragasidis
(Parece que eu perdi mencionar @BruceEdiger no meu comentário anterior)
dkaragasidis
1

Os DSOs da ELF podem usar um sinalizador (DF_TEXREL) para anunciar que exigem re-realocações modificando sua seção de texto (que normalmente é somente leitura). A abordagem da tabela de salto, juntamente com o código independente da posição da TORTA, deve ser mais ideal.

(Verificou isso em http://www.akkadia.org/drepper/dsohowto.pdf , mas outros recursos também mencionam isso).

PSkocik
fonte