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?
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).
la source