5.9. Ajustar las herramientas

Ahora que se han instalado las librerías de C temporales, todas las herramientas que compilemos en el resto de este capítulo deberían enlazarse contra ellas. Para conseguirlo, deben ajustarse el enlazador y el fichero specs del compilador.

El enlazador, que se ajustó al final del primer paso de Binutils, se instala ejecutando el siguiente comando desde el directorio binutils-build:

make -C ld install

Desde ahora todo se enlazará solamente contra las librerías que hay en /tools/lib.

[Nota]

Nota

Si por alguna razón olvidaste el aviso sobre conservar los directorios de las fuentes y de construcción del primer paso de Binutils, ignora el comando anterior. El resultado es la pequeña pega de que los siguientes programas de pruebas se enlazarán contra las librerías del anfitrión. Esto no es lo ideal, pero no es un gran problema. La situación se corregirá cuando instalemos un poco más adelante la segunda fase de Binutils.

Ahora que se ha instalado el enlazador ajustado, debes eliminar los directorios de las fuentes y de construcción de Binutils.

Lo siguiente es corregir el fichero de especificaciones de GCC para que apunte al nuevo enlazador dinámico. Un simple comando sed lo hará:

SPECFILE=`gcc --print-file specs` &&
sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
    $SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE

Recomendamos que copies y pegues lo anterior para asegurar que no hay errores. Alternativamente, puedes editar el fichero specs a mano si quieres. Esto se hace reemplazando cada aparición de “/lib/ld-linux.so.2” con “/tools/lib/ld-linux.so.2”.

Asegúrate de revisar visualmente el fichero specs para verificar que se han hecho los cambios deseados.

[Importante]

Importante

Si estás trabajando sobre una plataforma en la que el nombre del enlazador dinámico no es ld-linux.so.2, en el anterior comando debes sustituir ld-linux.so.2 con el nombre del enlazador dinámico de tu plataforma. En caso necesario consulta la Sección 5.3, “Notas técnicas sobre las herramientas”.

Existe la posibilidad de que algunos ficheros de cabecera de nuestro sistema anfitrión se hayan colado dentro del directorio privado de cabeceras de GCC. Esto puede suceder debido al proceso “fixincludes” de GCC que se ejecuta como parte de su proceso de construcción. Explicaremos esto con más detalle dentro de este capítulo. Por ahora, ejecuta este comando para eliminar dicha posibilidad:

rm -f /tools/lib/gcc/*/*/include/{pthread.h,bits/sigthread.h}
[Atención]

Atención

En este punto es obligatorio parar y asegurarse de que las operaciones básicas (compilación y enlazado) de las nuevas herramientas funcionan como se espera. Para esto vamos a hacer una simple comprobación:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser:

[Requesting program interpreter: 
    /tools/lib/ld-linux.so.2]

[Intérprete de programa solicitado: 
    /tools/lib/ld-linux.so.2]

Confirma que /tools/lib aparezca como el prefijo de tu enlazador dinámico.

Si no recibes una salida como la mostrada arriba, o no hay salida alguna, algo está seriamente mal. Investiga y revisa tus pasos para encontrar el problema y corregirlo. El problema debe resolverse antes de continuar. Primero, repite la comprobación de sanidad usando gcc en vez de cc. Si esto funciona significa que falta el enlace simbólico /tools/bin/cc. Vuelve a la Sección 5.5, “GCC-3.4.1 - Fase 1” e instala el enlace simbólico. Seguidamente, asegúrate de que tu PATH es correcto. Puedes comprobarlo ejecutando echo $PATH y verificando que /tools/bin está en cabeza de la lista. Si el PATH está mal puede significar que no has ingresado como usuario lfs o que algo salió mal en la Sección 4.4, “Configuración del entorno”. Otra opción es que algo pudo ir mal en el anterior arreglo del fichero specs. En este caso, repite el arreglo del fichero asegurándote de copiar y pegar los comandos como se recomendó.

Cuando todo esté bien, borra los ficheros de prueba:

rm dummy.c a.out