Red Hat Training

A Red Hat training course is available for RHEL 8

3.2. Enlace estático y dinámico

Los desarrolladores tienen la opción de usar enlace estático o dinámico cuando construyen aplicaciones con lenguajes completamente compilados. Esta sección enumera las diferencias, particularmente en el contexto del uso de los lenguajes C y C++ en Red Hat Enterprise Linux. Para resumir, Red Hat desaconseja el uso del enlazado estático en aplicaciones para Red Hat Enterprise Linux.

Comparación de la vinculación estática y dinámica

La vinculación estática hace que las bibliotecas formen parte del archivo ejecutable resultante. La vinculación dinámica mantiene estas bibliotecas como archivos separados.

El enlace dinámico y el estático pueden compararse de varias maneras:

Uso de los recursos

La vinculación estática da lugar a archivos ejecutables más grandes que contienen más código. Este código adicional procedente de las bibliotecas no puede ser compartido por varios programas del sistema, lo que aumenta el uso del sistema de archivos y el uso de la memoria en tiempo de ejecución. Varios procesos que ejecuten el mismo programa enlazado estáticamente seguirán compartiendo el código.

Por otro lado, las aplicaciones estáticas necesitan menos reubicaciones en tiempo de ejecución, lo que reduce el tiempo de arranque, y requieren menos memoria privada de tamaño de conjunto residente (RSS). El código generado para la vinculación estática puede ser más eficiente que para la vinculación dinámica debido a la sobrecarga introducida por el código independiente de la posición (PIC).

Seguridad
Las bibliotecas enlazadas dinámicamente que proporcionan compatibilidad ABI pueden ser actualizadas sin cambiar los archivos ejecutables que dependen de estas bibliotecas. Esto es especialmente importante para las bibliotecas proporcionadas por Red Hat como parte de Red Hat Enterprise Linux, donde Red Hat proporciona actualizaciones de seguridad. La vinculación estática contra cualquiera de estas bibliotecas está fuertemente desaconsejada.
Compatibilidad

La vinculación estática parece proporcionar archivos ejecutables independientes de las versiones de las bibliotecas proporcionadas por el sistema operativo. Sin embargo, la mayoría de las bibliotecas dependen de otras. Con el enlazado estático, esta dependencia se vuelve inflexible y, como resultado, se pierde la compatibilidad hacia adelante y hacia atrás. La vinculación estática garantiza que sólo funciona en el sistema en el que se ha creado el archivo ejecutable.

Aviso

Las aplicaciones que enlazan estáticamente bibliotecas de la biblioteca GNU C (glibc) siguen necesitando que glibc esté presente en el sistema como biblioteca dinámica. Además, la variante de la biblioteca dinámica de glibc disponible en el tiempo de ejecución de la aplicación debe ser una versión idéntica en cuanto a bits a la presente mientras se enlaza la aplicación. Como resultado, se garantiza que la vinculación estática sólo funciona en el sistema en el que se construyó el archivo ejecutable.

Cobertura de apoyo
La mayoría de las bibliotecas estáticas proporcionadas por Red Hat están en el canal CodeReady Linux Builder y no son soportadas por Red Hat.
Funcionalidad

Algunas bibliotecas, especialmente la GNU C Library (glibc), ofrecen una funcionalidad reducida cuando se enlazan estáticamente.

Por ejemplo, cuando se vincula estáticamente, glibc no admite hilos ni ninguna forma de llamadas a la función dlopen() en el mismo programa.

Como resultado de las desventajas enumeradas, la vinculación estática debería evitarse a toda costa, especialmente para aplicaciones completas y las bibliotecas glibc y libstdc .

Casos de vinculación estática

La vinculación estática puede ser una opción razonable en algunos casos, por ejemplo:

  • Utilizar una biblioteca que no está habilitada para el enlace dinámico.
  • La vinculación totalmente estática puede ser necesaria para ejecutar el código en un entorno o contenedor vacío de chroot. Sin embargo, Red Hat no admite la vinculación estática mediante el paquete glibc-static.

Recursos adicionales