¿Por qué usamos enlazado estático?

La mayoría de los pogramas deben de realizar, dentro de sus tareas específicas, muchas otras operaciones comúnes y triviales, como escribir en memoria, buscar directorios, abrir y cerrar ficheros, leerlos y escribirlos, manejo de cadenas, reconocimiento de patrones, aritmética y más. En lugar de obligar a todos los programas a reinventar la rueda, el sistema GNU proporciona todas estas funciones básicas preparadas para su uso en librerías. La mayor librería de cualquier sistema Linux es glibc. Para tener una idea de lo que contiene, mira el fichero glibc/index.html que se encuentra en algún lugar de tu sistema anfitrión.

Hay dos formas de enlazar las funciones de una librería en un programa que las utilice: estáticamente o dinámicamente. Cuando un programa se enlaza estáticamente el código de las funciones utilizadas se incluye en el ejecutable, resultando un programa algo abultado. Cuando un programa se enlaza dinámicamente, lo que se incluye es una referencia al enlazador, el nombre de la librería y el nombre de la función, resultando un ejecutable mucho más pequeño. Este ejecutable tiene la desventaja de ser algo más lento que uno enlazado estáticamente, pues al enlazarse en tiempo de ejecución se consume algo de tiempo.

Aparte de esta pequeña desventaja, el enlazado dinámico tiene dos ventajas mayores sobre el enlazado estático. Primero, sólo necesitas una copia del código ejecutable de la librería en tu disco duro, en vez de tener muchas copias del mismo código en un montón de programas, salvando espacio en el disco. En segundo lugar, cuando varios programas usan las mismas funciones de las librerías al mismo tiempo, sólo se requiere la carga de una copia del código de las funciones, salvando espacio en memoria.

Hoy en día salvar algunos megabytes de espacio puede que no parezca mucho, pero hace muchas lunas, cuando los discos se median en megabytes y la memoria en kilobytes, este ahorro era sustancial. Significaba ser capaz de tener varios programas en memoria al mísmo tiempo y contener un sistema Unix completo en unos pocos volúmenes de discos.

Una tercera ventaja, aunque menor, del enlazado dinámico es que cuando una función de una librería tiene una correción de un error, o es mejorada, sólo necesitas recompilar esta librería, en lugar de tener que recompilar todos los programas que usan esta función mejorada.

En resumen, podemos decir que el enlazado dinámico consume tiempo de ejecución en vez de espacio en memoria, espacio en disco y tiempo de recompilación.

Pero si el enlazado dinámico salva tanto espacio, ¿por qué entonces vamos a enlazar todos los programas de este capítulo estáticamente?. La razón es que no vamos a compilar aquí una glibc temporal. Y evitamos hacer esto simplemente para ahorrar algo de tiempo, sobre unos 14 SBUs. Otra razón es que la versión de Glibc del sistema LFS puede que no sea compatible con la Glibc del sistema anfitrión. Las aplicaciones compiladas con la Glibc de tu sistema anfitrión puede que no se ejecuten adecuadamente (o en absoluto) en el sistema LFS.

Esto significa que las herramientas compiladas en este capítulo deberán ser auto-contenidas, debido a que cuando posteriormente hagamos chroot a la partición LFS la librería GNU no estará disponible. Esto es por lo que usamos los modificadores -static, --enable-static-link, y --disable-shared a lo largo de este capítulo, para asegurarnos de que todos los ejecutables están enlazados estáticamente. Cuando vayamos al siguiente capítulo, casi la primera cosa que haremos es construir glibc, el conjunto principal de librerías del sistema. Una vez hecho, podemos enlazar todos los demás programas dinámicamente (incluidos los instalados estáticamente en este capítulo) y sacaremos provecho de las oportunidades de ahorro de espacio.