Reajustar las herramientas

Ahora que hemos instalado las nuevas librerías de C, es hora de reajustar nuestro conjunto de herramientas. Lo haremos de forma que cada programa que compilemos se enlace con las nuevas librerías de C. Básicamente, revertiremos el "bloqueo" que realizamos al principio del capítulo anterior.

Lo primero es ajustar 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: 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 Glibc que hay en /tools en vez de las de /usr. Esto no es lo ideal, pero nuestras pruebas han mostrado que los programas binarios de Binutils resultantes deberían ser identicos.

Desde ahora todos los programas que compilemos se enlazarán sólamente 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 tambien evita esto.

Ya puedes borrar los directorios de fuentes y de construcción de Binutils.

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 verificar el fichero de especificaciones para corroborar que se produjeron los cambios deseados.

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 la sección Notas técnicas sobre las herramientas del Capítulo 5.

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
gcc dummy.c
readelf -l a.out | grep ': /lib'

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

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

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

Si no obtienes una salida como la mostrada, o no hay ninguna salida, algo está realmente mal. Necesitarás investigar y revisar tus pasos para encontrar el problema y corregirlo. No hay razón para continuar hasta hacer esto. Muy posiblemente algo fué mal con las modificaciones anteriores en los ficheros de especificaciones. Advierte especialmente que /lib aparece como prefijo de nuestro enlazador dinámico. Por supuesto, si estás trabajando en una plataforma en la que el nombre del enlazador dinámico es distinto a ld-linux.so.2, entonces la salida será ligeramente diferente.

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

rm dummy.c a.out