Tengo una pequeña pregunta simple que alguien que sabe podrá responder fácilmente, busqué en Google pero no pude encontrar la respuesta.¿Los archivos .dll se cargan una vez para cada programa o una vez para todos los programas?
Hay muchos programas ejecutándose a la vez en una computadora, y mi pregunta es: cuando un programa carga una DLL, ¿carga realmente el archivo DLL o encuentra la memoria en la que la DLL ya está cargada? Por ejemplo, ¿se carga ws2_32.dll (winsock 2) para cada programa que usa winsock, o se carga una vez y todos los programas que lo usan usan las mismas direcciones de memoria para llamar a las funciones?
Ok, gracias, esto tiene sentido. Solo necesitaba saber si un puntero a una función de una DLL apuntaría a la misma dirección que usan todos los programas que usaron la función. – Nilbert
La respuesta a esa pregunta es "no". Los punteros de función son direcciones en los procesos * espacio de direcciones virtuales *, y eso definitivamente no se comparte entre procesos. Se puede cargar una DLL en diferentes direcciones en diferentes procesos y, por lo tanto, la dirección de un puntero a función será diferente, aunque se use la misma página física. –
De hecho, sería muy poco probable que la función tenga la misma dirección en dos programas diferentes. El código de la DLL se asignará al siguiente espacio de direcciones disponible después de todas las contribuciones del segmento de código que lo preceden. En Linux seguro, se usa la asignación aleatoria de dirección de carga (para evitar que viri use direcciones codificadas en ataques). No estás escribiendo un virus, ¿verdad? :-) – wallyk