J'ai une petite question simple que quelqu'un qui sait sera en mesure de répondre facilement, j'ai cherché google, mais n'a pas pu trouver la réponse.Les fichiers .dll sont-ils chargés une fois pour chaque programme ou une fois pour tous les programmes?
De nombreux programmes s'exécutent en même temps sur un ordinateur, et ma question est la suivante: lorsqu'un programme charge une DLL, charge-t-il réellement le fichier DLL ou trouve-t-il la mémoire dans laquelle la DLL est déjà chargée? Par exemple, est ws2_32.dll (winsock 2) chargé pour chaque programme qui utilise winsock, ou est-il chargé une fois et tous les programmes qui l'utilisent utilisent les mêmes adresses de mémoire pour appeler les fonctions?
Ok merci, cela a du sens. J'avais juste besoin de savoir si un pointeur vers une fonction d'une DLL pointe vers la même adresse que celle utilisée par tous les programmes qui ont utilisé la fonction. – Nilbert
La réponse à cette question est "non". Les pointeurs de fonction sont des adresses dans les processus * l'espace d'adressage virtuel *, ce qui n'est certainement pas partagé entre les processus. Une DLL peut être chargée à différentes adresses dans différents processus, et donc l'adresse d'un pointeur de fonction sera différente - même si la même page physique est utilisée. –
En fait, il serait hautement improbable que la fonction ait la même adresse dans deux programmes différents. Le code de la DLL sera mappé dans le prochain espace d'adressage disponible après toutes les contributions de segment de code qui le précèdent. Dans Secure Linux, la randomisation d'adresse de chargement est utilisée (pour empêcher viri d'utiliser des adresses codées en dur dans les attaques). Vous n'écrivez pas de virus, n'est-ce pas? :-) – wallyk