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:
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.
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