Linux From Scratch XIV: Ajustando el toolchain y compilando zlib y file

El siguiente paso en nuestra misión de compilar Linux From Scratch es ajustar el toolchain para que compile los programas usando la glibc que acabamos de compilar en vez de la del sistema temporal. El este caso no vamos a generar ningún paquete, simplemente vamos a hacer una serie de cambios en los ficheros que tenemos en /tools.

Para ello, antes de empezar con las instrucciones del libro, entramos en nuestro sistema LFS sin especificar ningún nombre de paquete.

[~/lfs]$ sudo lfs

Haciendo los ajustes

Los ajustes son sencillos. Simplemente se trata de reemplazar el linkador que estamos usando actualmente por el que dejamos preparado cuando compilamos el sistema temporal y modificar el fichero specs del compilador para que apunte al nuevo linkador.

root:/# mv -v /tools/bin/{ld,ld-old}
root:/# mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
root:/# mv -v /tools/bin/{ld-new,ld}
root:/# ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
root:/# gcc -dumpspecs | sed -e 's@/tools@@g' \
>     -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
>     -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
>     `dirname $(gcc --print-libgcc-file-name)`/specs

Ahora hay que comprobar que todo esté funcionando correctamente. Para ello compilamos un programa trivial y examinamos la salida del compilador. En primer lugar, comprobamos que está usando el cargador correcto.

root:/# echo 'main(){}' > dummy.c
root:/# cc dummy.c -v -Wl,--verbose &> dummy.log
root:/# readelf -l a.out | grep ': /lib'
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

En mi caso, por ser un sistema de 64 bits, la salida es esa en lugar de la que indica el libro. A continuación hacemos una serie de comprobaciones sobre el log que ha generado el compilador para asegurarnos de que todo esté bien. En primer lugar, comprobamos que esté usando el runtime correcto.

root:/# grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
/usr/lib/../lib64/crt1.o succeeded
/usr/lib/../lib64/crti.o succeeded
/usr/lib/../lib64/crtn.o succeeded

Es curiosa la salida que obtengo por ser un sistema de 64 bits. En lugar de dirigir la ruta directamente a /usr/lib64, pasa por /usr/lib y luego retrocede. De todos modos los ficheros a los que llega son los correctos, así que no tiene por qué dar problemas.

Comprobamos ahora que los headers se buscan en el directorio include correcto y que las librerías se buscan en las rutas correctas.

root:/# grep -B1 '^ /usr/include' dummy.log
#include <...> search starts here:
 /usr/include
root:/# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/tools/x86_64-unknown-linux-gnu/lib64")
SEARCH_DIR("/tools/x86_64-unknown-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");

Si vuestro sistema es de 32 bits, el primer SEARCH_DIR no aparecerá. Todo lo demás tiene que ser igual.

Ahora vamos a ver si el compilador está usando la glibc correcta y el cargador correcto. Ya hemos comprobado antes que el ejecutable estaba usando el cargador adecuado, pero es bueno asegurarse aquí también.

root:/# grep "/lib.*/libc.so.6 " dummy.log
attempt to open /lib64/libc.so.6 succeeded
root:/# grep found dummy.log
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2

Teniendo en cuenta las diferencias por estar compilando un sistema de 64 bits, parece que todo ha ido bien, así que borramos los ficheros que hemos generado para las pruebas y salimos del chroot.

root:/# rm -v dummy.c a.out dummy.log
root:/# exit

Instalando zlib

Ya que hemos ajustado el toolchain vamos a usarlo para empezar a compilar e instalar paquetes. En primer lugar, la zlib.

Las instrucciones para compilar la zlib son de las sencillas. Como siempre, el único cambio con respecto al libro es usar nuestro script para generar paquetes en caso de que queramos hacerlo así.

[~/lfs]$ sudo lfs zlib-1.2.7
root:/# cd sources/
root:/sources# tar xvf zlib-1.2.7.tar.bz2
root:/sources# cd zlib-1.2.7
root:/# ./configure --prefix=/usr
root:/sources/zlib-1.2.7# make
root:/sources/zlib-1.2.7# make check

...

large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!
        *** zlib test OK **

Todo compilado sin problemas y además los tests han ido bien. Ahora sólo falta instalar.

root:/sources/zlib-1.2.7# make install
root:/sources/zlib-1.2.7# mv -v /usr/lib/libz.so.* /lib
root:/sources/zlib-1.2.7# ln -sfv ../../lib/libz.so.1.2.7 /usr/lib/libz.so

Los dos últimos comandos son para mover la librería a /lib y crear un enlace en /usr/lib. El libro no dice por qué es necesario. Supongo que será porque algunos programas la buscan en /lib y otros en /usr/lib y, de esta manera, todos la encuentran busquen donde busquen.

Por último, generamos el paquete y lo instalamos. Si no estáis usando los scripts para generar paquetes, simplemente tenéis que borrar el directorio con el código fuente descomprimido.

root:/sources/zlib-1.2.7# exit
[~/lfs]$ sudo lfsinst zlib-1.2.7.txz

Instalando file

Para finalizar este post, vamos a instalar también file. Se trata de otro paquete sencillo de instalar. Incluso más sencillo que zlib. Voy a poner todos los comandos seguidos, porque no tienen nada destacable. Todo compila, pasa los tests e instala sin problemas.

[~/lfs]$ sudo lfs file-5.11
root:/# cd sources/
root:/sources# tar xvf file-5.11.tar.gz
root:/sources# cd file-5.11
root:/sources/file-5.11# ./configure --prefix=/usr
root:/sources/file-5.11# make
root:/sources/file-5.11# make check
root:/sources/file-5.11# make install
root:/sources/file-5.11# exit
[~/lfs]$ sudo lfsinst file-5.11.txz

Eso es todo. En el próximo post, binutils, que tiene más chicha.

EOF

Anuncios