6.12. GCC-4.1.2

El paquete GCC contiene la colección de compiladores GNU, que incluye los compiladores C y C++.

Tiempo estimado de construcción: 22 SBU banco de pruebas incluido
Espacio requerido en disco: 681 MB banco de pruebas incluido

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.1.2 - 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.1.2 y Glibc-2.5.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.1.2/configure --prefix=/usr \
    --libexecdir=/usr/lib --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit \
    --enable-clocale=gnu --enable-languages=c,c++

Compila el paquete:

make
[Importante]

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.1.2/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/6.3/.

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.1.2/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../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.1.2/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

6.12.2. Contenido de GCC

Programas instalados: c++, cc (enlace a gcc), cpp, g++, gcc, gccbug y gcov
Librerías instaladas: libgcc.a, libgcc_eh.a, libgcc_s.so, libmudflap.{a,so}, libssp.{a,so}libstdc++.{a,so} y libsupc++.a

Descripciones cortas

c++

El compilador de C++.

cc

El compilador de C.

cpp

El preprocesador de C. Lo usa el compilador para expandir las sentencias #include, #define y similares en los ficheros fuente.

g++

El compilador de C++.

gcc

El compilador de C.

gccbug

Un guión del intérprete de comandos que ayuda a crear notificaciones de errores.

gcov

Una herramienta para pruebas de rendimiento. Se usa para analizar programas y encontrar qué optimizaciones tendrán el mayor efecto.

libgcc

Contienen el soporte en tiempo de ejecución para gcc.

libmudflap

Contiene rutinas para la comprobación de límites de funcionalidad de GCC.

libssp

Contiene rutinas de soporte para la funcionalidad de protección stack-smashing de GCC.

libstdc++

La librería estándar de C++.

libsupc++

Proporciona rutinas de soporte para el lenguaje de programación c++.