Cuando realiza una vinculación estática, solo las funciones que (potencialmente) reciben se vinculan al ejecutable, pero en el tiempo de ejecución, los datos del archivo ejecutable serán leídos en la memoria por demanda de búsqueda.
Cuando se crea el proceso, las direcciones se asignan a todo el código en las bibliotecas ejecutables y compartidas para ese proceso, pero el código/datos del archivo no se leen necesariamente en la memoria física en ese momento. Cuando intente acceder a una dirección que no está actualmente en la memoria física, activará una excepción no presente. El administrador de memoria virtual del sistema operativo reaccionará a eso al leer la página del archivo en la memoria física, que dejar que proceda el acceso.
La carga se realiza página por página, lo que generalmente significa bloques de 4 u 8 kilobytes a la vez (por ejemplo, x86 usa páginas de 4K, Alpha usa 8k). x86 también tiene la capacidad de crear páginas más grandes (4 megabytes), pero esas no son (al menos usualmente) usadas para código normal; son para mapear grandes bloques de memoria que permanecen mapeados (semi) permanentemente, tales como la "ventana" de memoria en una tarjeta gráfica típica que también está mapeada para que la CPU pueda acceder directamente a ella.
La mayoría de los cargadores tienen algunas optimizaciones, así que (por ejemplo) que van a tratar de leer los bloques más grandes de la memoria cuando el programa se pone en marcha inicialmente. Esto permite que comience más rápido que si hubiera una interrupción y lectura separada para cada página de código a medida que se accede. Los detalles exactos de esa optimización varían entre sistemas operativos (y, a menudo, incluso versiones del mismo sistema operativo).
Buena pregunta ...No tengo idea de cuál es la respuesta, porque nunca tuve que pensar en ello ... lo cual plantea la pregunta contraria "¿Por qué crees que esto es importante?" ;-) Ergo: ¿Cuál es tu problema real? Danos algo de contexto. – corlettk
Si las bibliotecas se comparten, pueden ser utilizadas por varios programas al mismo tiempo. ¿Cómo se cuenta eso? –
Cuando se carga una lib compartida en la memoria, ¿agrega tamaño a su ejecutable? ¿Quién sabe? La biblioteca compartida podría ser cargada en la memoria y reutilizada (en la misma ubicación) por todas las aplicaciones. Incluso si encuentra una respuesta, eso no significa que se mantendrá en el futuro. Cada sistema operativo puede cambiar y optimizar el manejo de las bibliotecas compartidas. Esto está tan fuera de la especificación de cualquier lenguaje que aterrice únicamente en el sistema operativo. –