"Bloquear" Glibc

Ahora que hemos instalado las librerías de C temporales, queremos que todas las herramientas que compilemos en el resto de este capítulo se enlacen con ellas. Para conseguirlo, tenemos que ajustar el enlazador y el fichero de especificaciones del compilador.

Primero, instala el enlazador ajustado ejecutando el siguiente comando desde el directorio binutils-build:

make -C ld install

El enlazador se ajustó anteriormente, al final del primer paso de Binutils. Desde ahora todo se enlazará sólamente contra las librerías que hay en /tools/lib.

Nota: Si por alguna razón olvidaste el aviso sobre conservar los directorios de las fuentes y de construcción del primer paso de Binutils, los borraste accidentalmente o no tienes acceso a ellos, no te preocupes, no está todo perdido. Sólo ignora el comando anterior. El resultado es la pequeña pega de que los siguientes programas se enlazarán contra las librerías del anfitrión. Esto no es lo ideal, pero no es un gran problema. La situación se corrige cuando instalemos más tarde el segundo paso de Binutils.

Ahora que se ha instalado el enlazador ajustado, debes eliminar los directorios de las fuentes y de construcción de Binutils.

Lo siguiente es corregir nuestro fichero de especificaciones de GCC para que apunte al nuevo enlazador dinámico. Un simple comando sed lo hará:

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

Recomendamos que copies y pegues lo anterior en lugar de intentar escribirlo. O puedes editar el fichero de especificaciones a mano si quieres: simplemente reemplaza "/lib/ld-linux.so.2" con "/tools/lib/ld-linux.so.2".

Importante: Si estás trabajando sobre una plataforma en la que el nombre del enlazador dinámico no es ld-linux.so.2, en el anterior comando debes sustituir ld-linux.so.2 con el nombre del enlazador dinámico de tu plataforma. En caso necesario consulta la sección Notas técnicas sobre las herramientas.

Por último, existe la posibilidad de que algunos ficheros de cabecera de nuestro sistema anfitrión se hayan colado dentro del directorio privado de cabeceras de GCC. Esto puede suceder debido al proceso "fixincludes" de GCC que se ejecuta como parte de su proceso de construcción. Explicaremos esto con más detalle dentro de este capítulo. Por ahora, ejecuta este comando para eliminar dicha posibilidad.

rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}

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 ': /tools'

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

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

[Interprete de programa solicitado: /tools/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 /tools/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

Esto completa la instalación de un conjunto de herramientas autosuficiente, que ahora pueden usarse para construir el resto de las herramientas temporales.