6.12. 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. Es lo mismo que hicimos 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.

Comienza ajustando el enlazador. Para ello conservamos los directorios de fuentes y de construcción de la segunda fase de Binutils. Instala el enlazador ajustado ejecutando el siguiente comando desde el directorio binutils-build:

make -C ld INSTALL=/tools/bin/install install
[Nota]

Nota

Si de algún modo te saltaste el aviso sobre conservar los directorios de las fuentes y construcción del segundo paso de Binutils en el Capítulo 5, o los borraste accidentalmente, o no tienes acceso a ellos, ignora el comando anterior. El resultado será que el siguiente paquete, Binutils, se enlazará contra las librerías C que hay en /tools en vez de las de /{,usr}/lib. Esto no es lo ideal, pero nuestras pruebas han mostrado que los programas binarios de Binutils resultantes deberían ser idénticos.

Desde ahora todos los programas que compilemos se enlazarán solamente contra las librerías que hay en /usr/lib y /lib. La opción INSTALL=/tools/bin/install extra es necesaria porque el Makefile creado durante el segundo paso todavía contiene la referencia a /usr/bin/install, que obviamente aún no ha sido instalado. Algunas distribuciones tienen un enlace simbólico ginstall que tiene preferencia en el Makefile y puede crear problemas aquí. El comando anterior también evita esto.

Elimina los directorios de fuentes y de construcción de Binutils.

A continuación, corrige el fichero specs de GCC para que apunte al nuevo enlazador dinámico. Un comando perl lo consigue:

perl -pi -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g;' \
    -e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' \
        `gcc --print-file 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”.

[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 ': /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]

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

Comprueba que /lib aparezca como 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. 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 dummy.c a.out