6.10. Reajustar las herramientas

Ahora que hemos instalado las librerías de C finales, es hora de ajustar de nuevo el conjunto de herramientas. Las ajustaremos para que enlacen cualquier nuevo programa compilado contra estas nuevas librerías. Este es un proceso similar al usado en la fase “Ajustar” al principio del Capítulo 5, pero en sentido contario. En el Capítulo 5 el cambio iba de los directorios /{,usr}/lib del anfitrión al nuevo directorio /tools/lib. Ahora es guiado de /tools/lib a los directorios /{,usr}/lib del LFS.

Primero haz una copia de respaldo del enlazador situado en /tools y reemplazalo con el enlazador ajustado que creamos en el capítulo 5. También crearemos un enlaze a su contraparte en /tools/$(gcc -dumpmachine)/bin:

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

A continuación, corrige el fichero de especificaciones de GCC para que apunte al nuevo enlazador dinámico, y por tanto GCC sepa dónde encontrar las cabeceras correctas y los ficheros de inicio de Glibc. Un comando sed realiza esto:

[Importante]

Importante

Si estás trabajando sobre una plataforma en la que el nombre del enlazador dinámico no sea ld-linux.so.2, sustituye “ld-linux.so.2” en el comando siguiente por el nombre del enlazador dinámico para tu plataforma. Si es necesario, consulta la Sección 5.2, “Notas técnicas sobre las herramientas”.

gcc -dumpspecs | sed \
    -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
    `dirname $(gcc --print-libgcc-file-name)`/specs

Es buena idea inspeccionar visualmente el fichero de especificaciones para verificar que realmente se produjeron los cambios deseados.

[Importante]

Importante

Si estás trabajando sobre una plataforma en la que el nombre del enlazador dinámico no sea ld-linux.so.2, sustituye “ld-linux.so.2” en el comando anterior por el nombre del enlazador dinámico para tu plataforma. Si es necesario, consulta la Sección 5.2, “Notas técnicas sobre las herramientas”.

En este punto es obligatorio asegurarse de que las operaciones básicas (compilación y enlazado) de las nuevas herramientas ajustadas funcionan como se espera. Para hacer esto, realiza las siguientes comprobaciones de sanidad:

echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

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: /lib/ld-linux.so.2]

Comprueba que /lib aparezca como prefijo de tu enlazador dinámico.

Ahora asegurate de que lo hemos configurado para usar los ficheros de inicio correctos:

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

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

/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded

Verifica que el compilador busca los ficheros de cabecera correctos:

grep -B1 '^ /usr/include' dummy.log

Este comando debería mostrar la siguiente salida:

#include <...> search starts here:
 /usr/include

A continuación verifica que el nuevo enlazador se está usando con la ruta de búsqueda correcta:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

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

SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");

Segidamente asegurate de estar usando la libc correcta:

grep "/lib/libc.so.6 " dummy.log

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

attempt to open /lib/libc.so.6 succeeded

Por último, asegurate de que GCC utiliza el enlazador dinámico correcto:

grep found dummy.log

Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser (teniendo en cuenta las diferencias en el nombre del enlazador dinámico específico para cada plataforma):

found ld-linux.so.2 at /lib/ld-linux.so.2

Si no recibes una salida como la mostrada arriba, o no hay salida alguna, algo está realmente mal. Necesitarás investigar y revisar tus pasos para encontrar el problema y corregirlo. La razón más probable es que algo salió mal durante el anterior arreglo del fichero specs. Deberás resolver todos los problemas antes de seguir con el proceso.

Una vez que todo funcione coorectamente, borra los ficheros de prueba:

rm -v dummy.c a.out dummy.log