¿Por qué usamos enlazado estático?

(Doy gracias a Plasmatic por enviar, a una de las listas de correo de LFS, el texto en el que está basado ésto.)

Cuando construyes (compilas) un programa, en vez de reescribir todas las funciones que se ocupan de tratar con el núcleo, hardware, ficheros, etc... con cada nuevo programa que escribas, puedes encontrar todas esas funciones básicas guardadas en librerías. glibc, la cual instalaremos más tarde, es una de las principales librerías. En ellas se encuentra el código de todas las funciones básicas que utilizan los programas, las que permiten tareas como abrir ficheros, mostrar información en pantalla y recoger datos introducidos por el usuario. Cuando el programa es compilado, estas librerías son enlazadas junto con el nuevo programa, así que puede usar cualquiera de las funciones que contengan las librerías.

Sin embargo, estas librerías pueden ser muy grandes (por ejemplo, libc.a ronda normalmente los 2.5MB). Por lo tanto, no parece deseable tener una copia de cada librería añadida al programa. Tan sólo imagina que tienes un comando tan simple como ls con 2.5MB extra añadidos a él. En vez de hacer que la librería forme parte del programa, o que tenga las librerías enlazadas estáticamente, las librerías se mantienen en un fichero aparte que se carga cuando el programa lo necesita. Ésto es lo que se llama enlazar las librerías dinámicamente. Se les da este nombre porque las librerías se cargan y descargan dinámicamente según se las necesite.

Así que tenemos un fichero de 1 KB y otro de 2.5 MB, pero esto no nos ha ahorrado espacio (excepto, quizás, en memoria RAM mientras no se necesite la librería). La ventaja real del enlace dinámico es que sólo necesitamos una copia de la librería. Si ls y rm utilizan la misma librería, no necesitamos dos copias de ella, ya que ambos pueden utilizar el código del mismo fichero. Incluso cuando se cargan en memoria los dos programas comparten el código en vez de cargarlo dos veces. Así que no sólo se ahorra espacio en disco, si no que, además, se ahorra espacio en la preciada memoria RAM.

Si el enlazado dinámico nos ahorra tanto espacio, ¿por qué estamos haciendo que todo se enlace estáticamente? Bien, la razón es que cuando estableces como raíz (chroot) tu propio y nuevo (pero muy incompleto) entorno LFS, no estarán disponibles las librerías porque están situadas en alguna parte de tu antiguo árbol de directorios (por ejemplo /usr/lib), el cual no será accesible desde la raíz de LFS ($LFS).

Para que tus nuevos programas se ejecuten dentro de ese entorno, una vez establecida la nueva raíz, debes asegurarte que las librerías se enlazan estáticamente cuando los construyes. Por lo tanto, se utilizarán las opciones --enable-static-link, --disable-shared, y -static durante todo el Capítulo 5. Una vez en el Capítulo 6, lo primero que haremos será construir el principal conjunto de librerías del sistema, glibc. Tras hacer esto, comenzaremos a reconstruir los programas que se instalaron en el Capítulo 5, pero esta vez con las librerías enlazadas dinámicamente. De esta manera aprovechamos las ventajas de ahorro de espacio que nos ofrecen las librerías dinámicas.

Ahora ya sabes cuáles son las razones por las que necesitas usar opciones raras como -static. Si intentas construir todo sin ellas verás rápidamente lo que sucede cuando establezcas la raíz a tu nuevo sistema LFS lisiado.

Si quieres saber más sobre librerías dinámicas consulta algún libro o página web sobre programación, en especial alguno relacionado con Linux.