Ajustar las herramientas

Ahora que hemos instalado las librerías de C temporales, queremos que todas las herramientas que compilemos en el resto de este capítulo se enlacen con ellas. Para conseguirlo, tenemos que ajustar el enlazador y el fichero de especificaciones del compilador. Alguien podría decir que esto es magia negra, pero en realidad es muy simple.

Primero, instala el enlazador ajustado (ajustado al final de la primera fase de Binutils) 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, los borraste accidentalmente o no tienes acceso a ellos, no te preocupes, no está todo perdido. Sólo 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 corrige cuando instalemos un poco más adelante el segundo paso 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 nuestro fichero de especificaciones de GCC para que apunte al nuevo enlazador dinámico. Un simple comando sed lo hará:

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e '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 en lugar de intentar escribirlo. O puedes editar el fichero de especificaciones a mano si quieres: simplemente reemplaza “/lib/ld-linux.so.2” con “/tools/lib/ld-linux.so.2”. Revisa visualmente el fichero de especificaciones para verificar que los cambios se han hecho realmente.

[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 “Notas técnicas sobre las herramientas”.

Por último, 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-lib/*/*/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 (con las diferencias para la plataforma sobre el nombre del enlazador dinámico).:

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

[Interprete de programa solicitado: /tools/lib/ld-linux.so.2]

Advierte especialmente 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. Necesitarás investigar y revisar tus pasos para encontrar el problema y corregirlo. No hay motivo para continuar hasta que esté hecho. 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 “GCC-3.3.3 - Fase 1” y corrige el enlace simbólico. Segundo, asegurate de que tu PATH es correcto. Puedes comprobarlo ejecutando echo $PATH y comprobando 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 fué mal en “Configuración del entorno”. Tercero, algo pudo ir mal en el anterior arreglo del fichero de especificaciones. En este caso, repite el arreglo del fichero de especificaciones asegurandote de cortar y pegar los comandos como se recomendó.

Una vez estés seguro de que todo está bien, borra los ficheros de prueba:

rm dummy.c a.out