Librerie condivise ELF - motivazione per il PLT


11

È possibile utilizzare un codice di modifica automatica per accelerare la chiamata di funzioni in librerie collegate dinamicamente?

Per quanto ne so, le librerie condivise ELF usano una sorta di tabella di salto indiretto (la tabella di collegamento delle procedure o PLT) per abilitare il binding pigro delle funzioni delle librerie. Lo scopo sembra essere quello di evitare di dover modificare la tabella nel segmento di codice pur consentendo la risoluzione lenta delle posizioni delle funzioni alla prima chiamata.

Non sarebbe più veloce creare dinamicamente il codice per quella tabella al momento del caricamento, o forse anche alla prima chiamata di funzione?

Consentire il più possibile la condivisione del segmento di codice tra processi (una tabella dinamica sarebbe privata di un processo)? È per motivi di sicurezza (il codice scrivibile non dovrebbe essere eseguibile , ma i JIT lo fanno sempre e l'autorizzazione di scrittura potrebbe essere aggiunta e rimossa dal caricatore prima di avviare effettivamente il programma)?

O è una combinazione di questi, e il piccolo guadagno in termini di prestazioni per chiamata di funzione non varrebbe la pena?

Risposte:


8

Suppongo che stiamo parlando di architettura x86.

Non è possibile avere il codice di modifica automatica in modalità protetta , utilizzata dalla maggior parte dei sistemi operativi basati su UNIX (e non solo) di cui sono a conoscenza, poiché i segmenti di codice sono sempre di sola lettura. Un caricatore non controlla che -it sia qualcosa che viene gestito dal sottosistema di gestione della memoria del kernel.

Ma anche se tu potessi "creare il codice per quella tabella al momento del caricamento", come dici tu, sfiderebbe l'intero scopo delle librerie condivise. In questo modo, ogni processo avrebbe una copia "privata" delle funzioni della libreria nel suo spazio di indirizzi, aumentando efficacemente il suo ingombro di memoria - uno dei motivi per cui sono state create le librerie condivise, è stato quello di affrontare questo problema.

L'intero processo che descrivi è piuttosto complesso e costerebbe più cicli di elaborazione rispetto al metodo PLT utilizzato al giorno d'oggi e probabilmente introdurrebbe problemi di sicurezza più nuovi e interessanti.


2
È possibile utilizzare la chiamata di sistema mprotect (2) per rendere le pagine del segmento .text scrivibili ed eseguibili.
Bruce Ediger,

1
È corretto, signore. Probabilmente funzionerebbe decentemente sul sistema medio basato su UNIX, ma l'intero processo di collegamento si interromperà non appena qualcuno provasse a rafforzare il sistema con ad esempio PaX, il che impone restrizioni su mprotect (2).
dkaragasidis,

(Sembra che mi sia mancato menzionare @ BruceEdiger nel mio commento precedente)
dkaragasidis,

1

I DSO ELF possono utilizzare un flag (DF_TEXREL) per annunciare la necessità di rincocazioni modificando la loro sezione di testo (che è normalmente di sola lettura). Tuttavia, l'approccio della tabella di salto insieme al codice indipendente della posizione PIE dovrebbe essere più ottimale.

(Trovato in http://www.akkadia.org/drepper/dsohowto.pdf , ma anche altre risorse lo menzionano).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.