Una compilación estática es una versión compilada de un programa que se ha vinculado estáticamente con bibliotecas.
En informática , vincular significa tomar uno o más objetos generados por compiladores y ensamblarlos en un único programa ejecutable . Los objetos son módulos de programa que contienen código de máquina y definiciones de símbolos , que se presentan en dos variedades:
Un programa enlazador resuelve entonces las referencias a símbolos no definidos al averiguar qué otro objeto define un símbolo en cuestión y reemplazando los marcadores de posición con la dirección del símbolo. Los enlazadores pueden tomar objetos de una colección llamada biblioteca . El programa final no incluye toda la biblioteca, solo aquellos objetos de ella que son necesarios. Existen bibliotecas para diversos propósitos y, por lo general, se enlazan una o más bibliotecas del sistema de manera predeterminada.
Los entornos de sistemas operativos modernos permiten la vinculación dinámica , o la postergación de la resolución de algunos símbolos no definidos hasta que se ejecute un programa. Esto significa que el ejecutable aún contiene símbolos no definidos, además de una lista de objetos o bibliotecas que proporcionarán definiciones para estos. Al cargar el programa, también se cargarán estos objetos o bibliotecas y se realizará una vinculación final.
La vinculación dinámica ofrece tres ventajas:
En un programa construido estáticamente , no se produce ningún enlace dinámico: todos los enlaces se han realizado en el momento de la compilación .
Las compilaciones estáticas tienen un comportamiento muy predecible (porque no dependen de la versión particular de las bibliotecas disponibles en el sistema final) y se encuentran comúnmente en herramientas forenses y de seguridad para evitar una posible contaminación o mal funcionamiento debido a bibliotecas dañadas en la máquina examinada. La misma flexibilidad que permite que una biblioteca actualizada beneficie a todas las aplicaciones vinculadas dinámicamente también puede evitar que las aplicaciones que asumen la presencia de una versión específica de una biblioteca en particular se ejecuten correctamente. Si cada aplicación en un sistema debe tener su propia copia de una biblioteca dinámica para garantizar un funcionamiento correcto, los beneficios de la vinculación dinámica son discutibles.
Otra ventaja de las compilaciones estáticas es su portabilidad: una vez compilado el archivo ejecutable final, ya no es necesario conservar los archivos de biblioteca a los que hace referencia el programa, ya que todas las partes relevantes se copian en el archivo ejecutable. Como resultado, al instalar un programa compilado estáticamente en un equipo, el usuario no tiene que descargar e instalar bibliotecas adicionales: el programa está listo para ejecutarse.