Al crear una aplicación o programa, debe vincular bibliotecas u otros programas para ejecutar.

Su aplicación o programa debe seguir los pasos en una secuencia para indicar a los sistemas operativos que realicen una tarea específica. Durante este proceso, el sistema operativo debe convertir el código fuente almacenado en las bibliotecas de programas en código de máquina para su ejecución.
La vinculación se refiere a cómo los programas externos se vinculan con el sistema operativo para una ejecución exitosa. Hay dos métodos principales para lograr esto: enlaces estáticos y enlaces dinámicos.
El método que elija depende de varios factores, como el tamaño del archivo y el tiempo de carga. En esta publicación, aprenderá la diferencia entre enlaces estáticos y dinámicos, así como cuándo usar cada uno.
Contenido
¿Qué es la vinculación estática?
La vinculación estática es la práctica de copiar todas las bibliotecas que necesita el programa directamente en el ejecutable final. Esto sucede justo al final de la compilación y lo realiza el enlazador.
Primero, el enlazador vincula el código del programa con todas las bibliotecas requeridas. Una vez hecho esto, todo se compila en un solo ejecutable. Después de instalar el programa, todas las bibliotecas necesarias se cargan en la memoria.
Aquí es donde entra el término «estático». Ahora que todo se envía junto, debe realizar todo el proceso nuevamente si se realizan cambios en las bibliotecas externas.
Parece un proceso largo, pero el uso de enlaces estáticos tiene varias ventajas.
- La vinculación estática puede simplificar el proceso de distribución de binarios a múltiples entornos o sistemas operativos porque el programa ya tiene todo lo que necesita para ejecutarse.
- La vinculación estática puede resultar en un inicio ligeramente más rápido dependiendo de la complejidad del programa. Esto también da como resultado menos posibilidades de problemas de compatibilidad.
Pero la vinculación estática también tiene sus inconvenientes.
- Dado que compila y envía todas las bibliotecas en un ejecutable, el programa puede ser mucho más grande y usar muchos recursos. Esto incluye caché, RAM y espacio en disco.
- Si se producen cambios en programas externos, no se reflejarán automáticamente en el ejecutable. Tendrá que hacer todo el proceso de compilación y vinculación nuevamente.
Ahora analicemos otra opción: la vinculación dinámica.
¿Qué es el enlace dinámico?
La vinculación dinámica implica copiar bibliotecas externas o compartidas al ejecutable por nombre en tiempo de ejecución. Solo entonces el sistema operativo carga las bibliotecas requeridas en la memoria.
Durante la vinculación dinámica, el sistema operativo localiza bibliotecas externas cuando se inicia el programa. Si se producen cambios en las bibliotecas cargadas en la memoria, no es necesario volver a compilar el ejecutable y enviarlo como un ejecutable nuevo.
La vinculación dinámica tiene muchas ventajas.
- La vinculación dinámica conduce a tamaños de archivo más pequeños. El código de la biblioteca vinculada no necesita enviarse con el ejecutable. Esto significa un menor consumo de recursos como espacio en disco o memoria RAM.
- Si la biblioteca compartida ya está disponible en el sistema operativo, se puede reducir el tiempo de inicio.
- Puede actualizar las rutinas en las bibliotecas sin tener que volver a vincular, lo que significa que se pueden corregir errores y otros cambios sin tener que enviar un nuevo ejecutable.
- Los costos de mantenimiento son menores y la necesidad de soporte es menor.
Si bien esto generalmente suena más eficiente, la vinculación dinámica conlleva su propio conjunto de riesgos.
- Quitar la biblioteca puede dañar el programa. O si se realizan cambios en la biblioteca, puede encontrarse con problemas de compatibilidad y, como resultado, volver a trabajar en su aplicación.
- Si tiene un enlazador dinámico inflexible, es posible que el programa no se inicie o no se ejecute correctamente (también conocido como «dll infierno«).
Ahora que conoce los pros y los contras de cada uno, comparemos los dos métodos de vinculación.
Enlace estático versus dinámico
Esencialmente, la vinculación estática consiste en compilar bibliotecas en una aplicación o programa como parte del proceso de compilación. La vinculación dinámica permite que el sistema operativo pause y cargue bibliotecas compartidas en la memoria solo después de que se inicie la aplicación.
Ambos procesos de vinculación difieren en la forma en que se crean, entregan y administran. Pero la diferencia entre enlaces estáticos y dinámicos no se trata solo de la preferencia o la experiencia del usuario. Tendrá que elegir en función de sus casos de uso individuales, incluido lo que está creando y adónde lo va a enviar.
A veces, la decisión de usar uno en lugar del otro puede estar fuera de tus manos.
Por ejemplo, siempre necesitará enlaces dinámicos para crear complementos. Del mismo modo, puede ser la única forma práctica de cumplir con los requisitos para licencias de software libre como la LGPL.
Su compilador puede ser una limitación. Algunos compiladores (como el compilador de Google Go, que se usa comúnmente para trabajar con los feeds de Google Cloud) solo permiten la compilación estática de archivos binarios.
Pero, ¿cómo eliges cuando la decisión es tuya?
- Cuando se trata de rendimiento, es posible que desee considerar la vinculación dinámica. Si varios programas comparten las mismas bibliotecas compartidas, la vinculación dinámica puede superar el rendimiento de una aplicación vinculada estáticamente.
- Considere si su programa está realizando una gran cantidad de llamadas a la biblioteca o muchas llamadas a procedimientos de biblioteca pequeños. En este caso, los programas vinculados estáticamente pueden funcionar mejor.
Otro problema es el nivel y la frecuencia de las actualizaciones esperadas. El envío de correcciones de errores y actualizaciones es mucho menos eficiente con programas vinculados estáticamente. Deberá volver a compilar y enviar el ejecutable completo cada vez.
Con la vinculación dinámica, los usuarios cargarán la última versión del programa cada vez que lo ejecuten porque invocará la última versión de las bibliotecas. Para que pueda realizar los cambios necesarios sin tener que volver a compilar todo.

Trabajar con múltiples ejecutables: ¿enlace estático o dinámico?
Todo esto supone que estamos trabajando con un ejecutable cuidadosamente compilado. Pero, ¿y las extensiones?
Hay escenarios en los que la vinculación estática será completamente poco práctica y este es uno de ellos.
Suponga que tiene una aplicación móvil que contiene la aplicación principal pero usa extensiones para funciones específicas. Esto puede incluir, por ejemplo, extensiones de notificaciones push.
En este caso, las extensiones probablemente solo usen una pequeña cantidad de bibliotecas utilizadas por la aplicación principal. Sin embargo, es probable que las extensiones compartan mucho código con la aplicación principal.
Si tuviera que vincular estáticamente cada ejecutable, duplicaría el código que es común a todas las extensiones y la aplicación principal. Esto conduce a una gran cantidad de espacio desperdiciado en el dispositivo y, en el caso de las extensiones, el sistema operativo puede tener límites estrictos para construir este tipo de funcionalidad mediante enlaces dinámicos.
Combinando bibliotecas estáticas y dinámicas
Los enlaces estáticos y dinámicos pueden funcionar en conjunto de varias maneras. Por ejemplo, podría terminar en un escenario en el que necesita una biblioteca estática para formar parte de una biblioteca dinámica.
En este caso, querrá asegurarse de no obtener símbolos sin resolver cuando ejecute el ejecutable. Esto requiere crear una biblioteca dinámica que contenga todos los símbolos de una biblioteca estática separada.
Al crear una biblioteca estática, establezca una opción para que el compilador cree código independiente de la posición (PID) para cada objeto de la biblioteca estática. Otorgar el estado PID a los objetos de la biblioteca garantiza que se puedan mover, al igual que una biblioteca dinámica (que es lo que el sistema operativo eventualmente usará para hacer llamadas).
Uso de enlaces estáticos y dinámicos
Los enlaces estáticos y dinámicos son dos formas fundamentalmente diferentes de compilar y entregar un programa. Cada uno tiene sus ventajas y desventajas relacionadas con los tiempos de carga, el rendimiento general y la facilidad de actualización.
El método que elija depende completamente de su caso de uso y de dónde se implementa su aplicación. Antes de tomar una decisión, considere detenidamente las implicaciones de los diferentes sistemas operativos, la experiencia del usuario y la capacidad de implementar rápidamente parches y actualizaciones.









