Bibliothèques partagées ELF - motivation pour le PLT

11

Le code auto-modifiable peut-il être utilisé pour accélérer les appels de fonction dans les bibliothèques liées dynamiquement?

Pour autant que je le comprenne, les bibliothèques partagées ELF utilisent une sorte de table de saut indirect (la table de liaison de procédure, ou PLT) pour permettre la liaison paresseuse des fonctions de bibliothèque. Le but semble être d'éviter d'avoir à modifier la table dans le segment de code tout en permettant la résolution paresseuse des positions de fonction lors du premier appel.

Ne serait-il pas plus rapide de créer dynamiquement le code de cette table au moment du chargement, ou peut-être même au premier appel de fonction?

Est-ce pour permettre autant que possible le partage du segment de code entre les processus (une table dynamique serait privée d'un processus)? Est-ce pour des raisons de sécurité (le code inscriptible ne doit pas être exécutable - mais les JIT le font tout le temps, et l'autorisation d'écriture peut être ajoutée et supprimée par le chargeur avant de démarrer réellement le programme)?

Ou est-ce une combinaison de ceux-ci, et le petit gain de performances par appel de fonction n'en vaut pas la peine?

lxgr
la source

Réponses:

8

Je suppose que nous parlons d'architecture x86.

Vous ne pouvez pas avoir de code à modification automatique en mode protégé , qui est utilisé par la plupart des systèmes d'exploitation UNIX (et pas seulement) à ma connaissance, car les segments de code sont toujours en lecture seule. Un chargeur ne contrôle pas que - c'est quelque chose qui est géré par le sous-système de gestion de la mémoire du noyau.

Mais même si vous pouviez "créer le code de cette table au moment du chargement" comme vous le dites, cela irait à l'encontre de l'objectif des bibliothèques partagées. De cette façon, chaque processus aurait une copie "privée" des fonctions de la bibliothèque dans son espace d'adressage, augmentant efficacement son empreinte mémoire - l'une des raisons pour lesquelles des bibliothèques partagées ont été créées, était de résoudre ce problème.

L'ensemble du processus que vous décrivez est assez complexe, et cela coûterait plus de cycles de traitement que la méthode PLT qui est utilisée de nos jours, et introduirait probablement plus de problèmes de sécurité nouveaux et intéressants.

dkaragasidis
la source
2
Vous pouvez utiliser l'appel système mprotect (2) pour rendre les pages de segment .text accessibles en écriture et exécutables.
Bruce Ediger
1
C'est exact, monsieur. Cela fonctionnerait probablement convenablement sur le système UNIX moyen, mais tout le processus de liaison s'arrêterait dès que quelqu'un tenterait de durcir le système avec, par exemple, PaX, ce qui impose des restrictions sur mprotect (2).
dkaragasidis
(Il semble que j'ai manqué de mentionner @BruceEdiger dans mon commentaire précédent)
dkaragasidis
1

Les DSO ELF peuvent utiliser un indicateur (DF_TEXREL) pour annoncer qu'ils nécessitent des rellocations en modifiant leur section de texte (qui est normalement en lecture seule). L'approche de la table de saut avec le code indépendant de la position PIE devrait cependant être plus optimale.

(Trouvé sur http://www.akkadia.org/drepper/dsohowto.pdf , mais d'autres ressources le mentionnent également).

PSkocik
la source