SS 2024-10-17 12:20:31

This commit is contained in:
Jose
2024-10-17 12:20:31 +02:00
parent 0eaedd757e
commit f6c4e031f3
6 changed files with 98 additions and 43 deletions

View File

@@ -162,3 +162,23 @@ Es el proceso final de la construcción del ejecutable. Hay dos tipos:
- **Estático:** posible en todos los IDE.
- **Dinámico:** posible en algunos SO/IDE. En el dinámico, el SO completa parte del enlace en la carga del programa y/o durante su ejecución.
![[Pasted image 20241010120358.png]]
Al linker se le da ese nombre ya que el .exe es el resultado de unir secciones de cada uno de los .obj/lib.
![[Pasted image 20241017112904.png|600]]
Una vez construidas las secciones, el linker resuelve las referencias pendientes (relocalización de código). Para este proceso, el linker necesita saber qué instrucciones quedan por rellenar, que lo encuentra en la **tabla de reubicación** del archivo objeto.
![[Pasted image 20241017113303.png|600]]
## <mark style="background: #ADCCFFA6;">6. Bibliotecas</mark>
Una biblioteca es básicamente un contenedor de archivos objeto.
![[Pasted image 20241017113556.png]]
### <mark style="background: #FFB86CA6;">Enlace dinámico</mark>
A diferencia del **enlace estático**, donde el ejecutable se construye totalmente durante el linkado, en el **enlace dinámico** algunas bibliotecas se enlazan cuando el ejecutable se carga en memoria (por lo que se encarga el SO).
- El principal objetivo de esto es ahorrar espacio en disco y memoria.
- En **linkado estático**, si una función (por ejemplo `printf`) está en una biblioteca estática, `printf`está en el ejecutable y en **todos** los ejecutables del disco que usen la función. Si varios de los ejecutables están en ejecución, todos tendrán una copia exactamente igual de `printf`.
- El **linkado dinámico** trata de minimizar esta situación almacenando `printf` (al igual que todas las funciones de la biblioteca estándar de C/C++) en un archivo DLL, y luego sigue estos pasos:
- El SO carga el programa que usa funciones en DLL, para esto localiza todos los .dll que necesita.
- Si falta alguno, para la carga
- Si están todos, sigue la carga
- Si continúa la carga, para cada función en DLL del programa comprueba si hay algún programa usando la función (usando como ejemplo `printf`):
- Si no lo hay, carga en memoria el módulo donde está `printf` en el DLL y la enlaza.
- Si lo hay, localiza la función en memoria y la enlaza. Además crea una nueva sección de datos para `printf` en el espacio de memoria virtual del nuevo programa.
- Al cerrarse todos los programas que usan ese código, se descarga de memoria.
**El objetivo es que todo programa en ejecución comparta el código de printf.obj pero que cada uno tenga una copia privada de los datos definidos en este.**

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB