6.12.1. Instalación de GCC
Aplica una sustitución sed que suprimirá la instalación
de libiberty.a
. Se usará en su lugar
la versión de libiberty.a
suministrada por Binutils:
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
El proceso "bootstrap" realizado en Sección 5.4, “GCC-4.2.1 - Fase
1” construye GCC con la opción -fomit-frame-pointer
. Las construcciones no
"bootstrap" omiten dicha opción, así que aplica el siguiente
sed para usarla y
asegurar construcciones consistentes del compliador:
sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
Se sabe que el guión fixincludes en ocasiones intenta
“corregir” erroneamente las
cabeceras instaladas anteriormente en el sistema. Como se sabe que
las cabeceras instaladas por GCC-4.2.1 y Glibc-2.6.1 no necesitan
corrección, ejecuta el siguiente comando para evitar que se ejecute
el guión fixincludes:
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
GCC proporciona un guión gccbug que detecta en tiempo de
compilación si mktemp
está presente, y fija el resultado en una prueba. Si no lo
encuentra, el guión utilizará nombres menos aleatorios para los
ficheros temporales. Instalaremos Mktemp mas tarde, por lo que el
siguiente sed
simulará su presencia:
sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
La documentación de GCC recomienda construirlo fuera del árbol de
las fuentes, en un directorio de construcción dedicado:
mkdir -v ../gcc-build
cd ../gcc-build
Prepara GCC para su compilación:
../gcc-4.2.1/configure --prefix=/usr \
--libexecdir=/usr/lib --enable-shared \
--enable-threads=posix --enable-__cxa_atexit \
--enable-clocale=gnu --enable-languages=c,c++ \
--disable-bootstrap
Compila el paquete:
make
Importante
En esta sección, el banco de pruebas para GCC se considera
crítico. No te lo saltes bajo ninguna circunstancia.
Comprueba los resultados, pero no pares en los errores:
make -k check
Para ver un resúmen del resultado de las pruebas, ejecuta:
../gcc-4.2.1/contrib/test_summary
Pare ver sólo los resultados, tuneliza la salída a través de
grep -A7 Summ
.
Los resultados pueden compararse con los que se encuentran en
http://www.linuxfromscratch.org/lfs/build-logs/development/.
Algunos fallos inexperados no pueden evitarse siempre. Los
desarrolladores de GCC están normalmente enterados de estos
problemas, pero no los han resuleto aún. En concreto, se sabe que
las pruebas de libmudflap
son
particularmente problemáticas debido a un error en GCC (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003).
A no ser que los resultados de las pruebas varíen notablemente de
los mostrados en la URL anterior, puedes continuar tranquilo.
Instala el paquete:
make install
Algunos paquetes esperan que el preprocesador de C esté instalado
en el directorio /lib
. Para dar
soporte a estos paquetes, crea un enlace simbólico:
ln -sv ../usr/bin/cpp /lib
Muchos paquetes usan el nombre cc para llamar al compilador C.
Para satisfacer a dichos paquetes, crea un enlace simbólico:
ln -sv gcc /usr/bin/cc
Ahora que nuestras herramientas principales finales están en su
sitio, es importante asegurarse de nuevo de que la compilación y el
enlazado funcionan como se espera. Para hacer esto realizaremos las
mismas comprobaciones de sanidad que usamos anteriormente en este
capítulo:
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]
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/gcc/i686-pc-linux-gnu/4.2.1/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.2.1/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.2.1/../../../crtn.o succeeded
Verifica que el compilador busca los ficheros de cabecera
correctos:
grep -B3 '^ /usr/include' dummy.log
Este comando debería mostrar la siguiente salida:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.2.1/include
/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("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/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