Reajustar las herramientas

Ahora que hemos instalado las nuevas y finales librerías de C, es hora de ajustar de nuevo nuestro conjunto de herramientas. Las ajustaremos para que enlacen cualquier nuevo programa compilado contra estas nuevas librerías. De hecho es lo mismo que hicimos en la fase “Ajustar” al principio del capítulo anterior, incluso parace lo contario: antes lo guiamos de los directorios /{,usr}/lib del anfitrión a los nuevos /tools/lib, ahora lo guiamos de /tools/lib a los directorios /{,usr}/lib del LFS.

Primero ajustaremos 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, no te preocupes, no todo está perdido. 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. El INSTALL=/tools/bin/install extra es necesario 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.

Ahora debes borrar los directorios de fuentes y de construcción de Binutils. (Esto es importante, pues deberías empezar la siguiente sección con un nuevo desempaquetado del paquete.)

Lo siguiente es corregir el fichero de especificaciones de GCC para que apunte al nuevo enlazador dinámico. Como antes, usaremos sed para hacerlo:

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
    $SPECFILE > newspecfile &&
mv -f newspecfile $SPECFILE &&
unset SPECFILE

De nuevo te recomendamos que copies y pegues este comando. Como antes, 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 simbólico no sea ld-linux.so.2, debes sustituir ld-linux.so.2 en el comando anterior por el nombre del enlazador dinámico para tu plataforma. Si es necesario, consulta “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]

Advierte especialmente que /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. Muy posiblemente algo fue mal durante el anterior arreglo del fichero de especificaciones.

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

rm dummy.c a.out