Linux From Scratch V: Acabando con binutils y gcc

Sigo compilando el sistema temporal de mi Linux From Scratch que me va a servir después para generar el sistema definitivo. En mi anterior post deje compilado el primer paso de binutils y del gcc. En este voy a avanzar hasta terminar el segundo paso. Para ello sigo con el siguiente punto del libro que consiste en compilar las cabeceras del API de linux.

Compilando los headers del API de linux

Lo primero que hay que hacer, como siempre, es descomprimir el paquete correspondiente. Se trata del código fuente del kernel. La versión que voy a usar es la 3.5.2, que es la que recomienda el libro.

[lfs@corellia sources]$ tar xvJf linux-3.5.2.tar.xz 

...

linux-3.5.2/virt/kvm/ioapic.h
linux-3.5.2/virt/kvm/iodev.h
linux-3.5.2/virt/kvm/iommu.c
linux-3.5.2/virt/kvm/irq_comm.c
linux-3.5.2/virt/kvm/kvm_main.c
[lfs@corellia sources]$ cd linux-3.5.2
[lfs@corellia linux-3.5.2]$

Ahora viene la compilación, pero no se trata de compilar el kernel completo. Sólo hay que tomar los headers porque los demás paquetes los necesitarán para poder compilarlos más adelante.

[lfs@corellia linux-3.5.2]$ make mrproper
[lfs@corellia linux-3.5.2]$ make headers_check
  CHK     include/linux/version.h
  UPD     include/linux/version.h
  HOSTCC  scripts/basic/fixdep
  HOSTCC  arch/x86/tools/relocs
  SYSHDR  arch/x86/syscalls/../include/generated/asm/unistd_64.h
  SYSHDR  arch/x86/syscalls/../include/generated/asm/unistd_32.h
  SYSHDR  arch/x86/syscalls/../include/generated/asm/unistd_x32.h

...

  CHECK   include/linux/usb (10 files)
  CHECK   include/linux (377 files)
  CHECK   include/linux/wimax (1 files)
/mnt/lfs/sources/linux-3.5.2/usr/include/linux/kexec.h:49: userspace cannot reference function or variable defined in the kernel
/mnt/lfs/sources/linux-3.5.2/usr/include/linux/soundcard.h:1054: userspace cannot reference function or variable defined in the kernel
  CHECK   include/asm (58 files)
[lfs@corellia linux-3.5.2]$ echo $?
0

No me gustan mucho los errores que aparecen, pero por lo que veo aquí, si el proceso termina con código de retorno 0, se pueden ignorar, así que continúo haciendo la instalación. Los ficheros se instalan en un directorio aparte y luego se copian a /tools/include en vez de instalarlos directamente en /tools/include, porque la instalación borra todos los ficheros del directorio destino. Para esto usamos la opción INSTALL_HDR_PATH=dest.

[lfs@corellia linux-3.5.2]$ make INSTALL_HDR_PATH=dest headers_install
  CHK     include/linux/version.h
make[1]: Nothing to be done for `all'.
make[1]: Nothing to be done for `relocs'.
  INSTALL include/drm (15 files)
  INSTALL include/asm-generic (35 files)
  INSTALL include/rdma (6 files)
  INSTALL include/mtd (5 files)

...

  INSTALL include/linux/usb (10 files)
  INSTALL include/linux/wimax (1 file)
  INSTALL include/linux (377 files)
  INSTALL include/asm (58 files)
[lfs@corellia linux-3.5.2]$ cp -rv dest/include/* /tools/include
'dest/include/asm' -> '/tools/include/asm'
'dest/include/asm/ptrace-abi.h' -> '/tools/include/asm/ptrace-abi.h'
'dest/include/asm/a.out.h' -> '/tools/include/asm/a.out.h'
'dest/include/asm/vm86.h' -> '/tools/include/asm/vm86.h'
'dest/include/asm/sockios.h' -> '/tools/include/asm/sockios.h'
'dest/include/asm/resource.h' -> '/tools/include/asm/resource.h'

...

'dest/include/xen' -> '/tools/include/xen'
'dest/include/xen/.install' -> '/tools/include/xen/.install'
'dest/include/xen/privcmd.h' -> '/tools/include/xen/privcmd.h'
'dest/include/xen/evtchn.h' -> '/tools/include/xen/evtchn.h'
'dest/include/xen/..install.cmd' -> '/tools/include/xen/..install.cmd'
[lfs@corellia linux-3.5.2]$

Una vez copiados los headers en su sitio, borro el directorio con el código fuente del kernel descomprimido. No lo voy a volver a necesitar hasta el siguiente capítulo del libro.

[lfs@corellia linux-3.5.2]$ cd ..
[lfs@corellia sources]$ rm -rf linux-3.5.2
[lfs@corellia sources]$

Esta parte ha sido muy fácil. Pasamos ahora a compilar glibc, la librería de C de GNU donde están las funciones de C básicas.

Compilando glibc

Lo primero de todo es descomprimir el paquete.

[lfs@corellia sources]$ tar xvJf glibc-2.16.0.tar.xz

...

glibc-2.16.0/wctype/wctrans.c
glibc-2.16.0/wctype/wctrans_l.c
glibc-2.16.0/wctype/wctype.c
glibc-2.16.0/wctype/wctype.h
glibc-2.16.0/wctype/wctype_l.c
[lfs@corellia sources]$ cd glibc-2.16.0
[lfs@corellia glibc-2.16.0]$

Parece ser que en algunos sistemas falta un fichero de cabecera de rpc. El siguiente comando comprueba si no existe y, en ese caso, lo copia desde el código fuente de glibc.

[lfs@corellia glibc-2.16.0]$ if [ ! -r /usr/include/rpc/types.h ]; then 
>   su -c 'mkdir -p /usr/include/rpc'
>   su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
> fi
[lfs@corellia glibc-2.16.0]$

El libro incluye también un comando para eliminar una opción del Makefile que da problemas con gcc 4.7.1. Como yo estoy usando gcc 4.7.2 voy a intentar primero compilar con esta opción, o sea que me salto el comando. Si no hay suerte siempre puedo repetir la compilación más tarde. Por lo tanto, el siguiente paso, es crear un directorio para compilar en él y lanzar los comandos.

[lfs@corellia glibc-2.16.0]$ mkdir -v ../glibc-build
mkdir: created directory '../glibc-build'
[lfs@corellia glibc-2.16.0]$ cd ../glibc-build
[lfs@corellia glibc-build]$ ../glibc-2.16.0/configure                             \
>       --prefix=/tools                                 \
>       --host=$LFS_TGT                                 \
>       --build=$(../glibc-2.16.0/scripts/config.guess) \
>       --disable-profile                               \
>       --enable-add-ons                                \
>       --enable-kernel=2.6.25                          \
>       --with-headers=/tools/include                   \
>       libc_cv_forced_unwind=yes                       \
>       libc_cv_ctors_header=yes                        \
>       libc_cv_c_cleanup=yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-lfs-linux-gnu
checking for x86_64-lfs-linux-gnu-gcc... x86_64-lfs-linux-gnu-gcc
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes

...

configure: creating ./config.status
config.status: creating config.make
config.status: creating Makefile
config.status: creating config.h
config.status: executing default commands
[lfs@corellia glibc-build]$ make

...

/mnt/lfs/tools/bin/../lib/gcc/x86_64-lfs-linux-gnu/4.7.1/../../../../x86_64-lfs-linux-gnu/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
make[2]: *** [/mnt/lfs/sources/glibc-build/iconv/iconvconfig] Error 1
make[2]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0/iconv'
make[1]: *** [iconv/others] Error 2
make[1]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0'
make: *** [all] Error 2

Pues ha fallado. 🙂 Ahora es cuando voy a lanzar el comando al que me refería antes.

[lfs@corellia glibc-build]$ cd -
/mnt/lfs/sources/glibc-2.16.0
[lfs@corellia glibc-2.16.0]$ sed -i 's/ -lgcc_s//' Makeconfig
[lfs@corellia glibc-2.16.0]$ cd ../glibc-build
[lfs@corellia glibc-build]$ ../glibc-2.16.0/configure                             \
>       --prefix=/tools                                 \
>       --host=$LFS_TGT                                 \
>       --build=$(../glibc-2.16.0/scripts/config.guess) \
>       --disable-profile                               \
>       --enable-add-ons                                \
>       --enable-kernel=2.6.25                          \
>       --with-headers=/tools/include                   \
>       libc_cv_forced_unwind=yes                       \
>       libc_cv_ctors_header=yes                        \
>       libc_cv_c_cleanup=yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-lfs-linux-gnu
checking for x86_64-lfs-linux-gnu-gcc... x86_64-lfs-linux-gnu-gcc
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes

...

configure: creating ./config.status
config.status: creating config.make
config.status: creating Makefile
config.status: creating config.h
config.status: executing default commands
[lfs@corellia glibc-build]$ make clean

...
rm -f /mnt/lfs/sources/glibc-build/soversions.mk /mnt/lfs/sources/glibc-build/soversions.i /mnt/lfs/sources/glibc-build/shlib-versions.v /mnt/lfs/sources/glibc-build/shlib-versions.v.i /mnt/lfs/sources/glibc-build/sysd-syscalls /mnt/lfs/sources/glibc-build/sysd-versions /mnt/lfs/sources/glibc-build/Versions.all /mnt/lfs/sources/glibc-build/abi-versions.h /mnt/lfs/sources/glibc-build/Versions.def.v.i /mnt/lfs/sources/glibc-build/Versions.def.v /mnt/lfs/sources/glibc-build/Versions.v.i /mnt/lfs/sources/glibc-build/Versions.v /mnt/lfs/sources/glibc-build/testrun.sh /mnt/lfs/sources/glibc-build/sysd-dirs /mnt/lfs/sources/glibc-build/sysd-rules /mnt/lfs/sources/glibc-build/sysd-sorted /mnt/lfs/sources/glibc-build/soversions.mk /mnt/lfs/sources/glibc-build/soversions.i
make[1]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0'
[lfs@corellia glibc-build]$ make

...

x86_64-lfs-linux-gnu-gcc -nostdlib -nostartfiles -static -o /mnt/lfs/sources/glibc-build/elf/ldconfig    /mnt/lfs/sources/glibc-build/csu/crt1.o /mnt/lfs/sources/glibc-build/csu/crti.o `x86_64-lfs-linux-gnu-gcc  --print-file-name=crtbegin.o` /mnt/lfs/sources/glibc-build/elf/ldconfig.o /mnt/lfs/sources/glibc-build/elf/cache.o /mnt/lfs/sources/glibc-build/elf/readlib.o /mnt/lfs/sources/glibc-build/elf/xmalloc.o /mnt/lfs/sources/glibc-build/elf/xstrdup.o /mnt/lfs/sources/glibc-build/elf/chroot_canon.o  -Wl,--start-group /mnt/lfs/sources/glibc-build/libc.a -lgcc -lgcc_eh  -Wl,--end-group `x86_64-lfs-linux-gnu-gcc  --print-file-name=crtend.o` /mnt/lfs/sources/glibc-build/csu/crtn.o
make[2]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0/elf'
make[1]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0'

Vale. Ahora ha funcionado. Se ve que el gcc 4.7.2 tiene el mismo problema que el 4.7.1. Como el susodicho comando modifica el Makefile, he preferido repetir todo el proceso desde el configure. Ahora instalamos todos los ficheros compilados.

[lfs@corellia glibc-build]$ make install

...

d/login/stubs /mnt/lfs/sources/glibc-build/elf/stubs) > /mnt/lfs/sources/glibc-build/stubs.h
if test -r /tools/include/gnu/stubs-64.h && cmp -s /mnt/lfs/sources/glibc-build/stubs.h /tools/include/gnu/stubs-64.h; \
then echo 'stubs.h unchanged'; \
else /usr/bin/install -c -m 644 /mnt/lfs/sources/glibc-build/stubs.h /tools/include/gnu/stubs-64.h; fi
rm -f /mnt/lfs/sources/glibc-build/stubs.h
make[1]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0'
[lfs@corellia glibc-build]$

Todo el proceso ha durado 15 minutos y 24 segundos. Según el libro debería haber durado 7 minutos y 10 segundos. La mitad. Se ve que lo del SBU no es muy fiable. Aún así no ha sido demasiado tiempo.

Ahora viene un paso importante. Hay que comprobar que el sistema que he compilado hasta ahora es capaz de compilar y linkar programas básicos. Esto es crítico. Si algo no funciona no puedo continuar. Tendría que volver a revisar todo lo que he hecho buscando el problema y asegurarme de corregirlo. Para comprobar esto, el libro trae algunos comandos.

[lfs@corellia glibc-build]$ echo 'main(){}' > dummy.c
[lfs@corellia glibc-build]$ $LFS_TGT-gcc dummy.c
[lfs@corellia glibc-build]$ readelf -l a.out | grep ': /tools'
      [Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
[lfs@corellia glibc-build]$ rm -v dummy.c a.out
removed 'dummy.c'
removed 'a.out'
[lfs@corellia glibc-build]$

Perfecto. No da errores y sale justo el mensaje que el libro indica (adaptado a mi sistema, que es de 64 bits, claro). Parece que puedo continuar. Primero voy a borrar los restos de la compilación y el código fuente descomprimido:

[lfs@corellia glibc-build]$ cd ..
[lfs@corellia sources]$ rm -rf glibc-build/ glibc-2.16.0
[lfs@corellia sources]$

Compilando binutils (segundo paso)

Por fin ha llegado el momento de dejar binutils compilado en el sistema temporal. Como ya tenía el código fuente descomprimido y el parche aplicado, me meto en el directorio correspondiente y empiezo el proceso.

[lfs@corellia sources]$ cd binutils-build/
[lfs@corellia binutils-build]$ CC=$LFS_TGT-gcc            \
> AR=$LFS_TGT-ar             \
> RANLIB=$LFS_TGT-ranlib     \
> ../binutils-2.22/configure \
>     --prefix=/tools        \
>     --disable-nls          \
>     --with-lib-path=/tools/lib

...

checking where to find the target strip... just compiled
checking where to find the target windres... just compiled
checking where to find the target windmc... just compiled
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether -fkeep-inline-functions is supported... yes
configure: creating ./config.status
config.status: creating Makefile
[lfs@corellia binutils-build]$ make

...

readelf readelf.o version.o unwind-ia64.o dwarf.o elfcomm.o  ../libiberty/libiberty.a 
libtool: link: x86_64-lfs-linux-gnu-gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Werror -g -O2 -o readelf readelf.o version.o unwind-ia64.o dwarf.o elfcomm.o  ../libiberty/libiberty.a
make[4]: Leaving directory `/mnt/lfs/sources/binutils-build/binutils'
make[3]: Leaving directory `/mnt/lfs/sources/binutils-build/binutils'
make[2]: Leaving directory `/mnt/lfs/sources/binutils-build/binutils'
make[1]: Leaving directory `/mnt/lfs/sources/binutils-build'
[lfs@corellia binutils-build]$ make install

...

  fi; \
done
make[5]: Leaving directory `/mnt/lfs/sources/binutils-build/binutils'
make[4]: Leaving directory `/mnt/lfs/sources/binutils-build/binutils'
make[3]: Leaving directory `/mnt/lfs/sources/binutils-build/binutils'
make[2]: Leaving directory `/mnt/lfs/sources/binutils-build/binutils'
make[1]: Leaving directory `/mnt/lfs/sources/binutils-build'
[lfs@corellia binutils-build]$

Ha sido muy fácil. Es de destacar las variables que se ponen delante de configure para que use el compilador que tenemos generado hasta ahora. Lo único que queda es preparar el linkador para usarlo en el siguiente capítulo del libro.

[lfs@corellia binutils-build]$ make -C ld clean
make: Entering directory `/mnt/lfs/sources/binutils-build/ld'
Making clean in po
make[1]: Entering directory `/mnt/lfs/sources/binutils-build/ld/po'
rm -f core core.* *.pox ld.po *.old.po cat-id-tbl.tmp

...

rm -f *.lo
rm -rf tmpdir
rm -f "./so_locations"
make[1]: Leaving directory `/mnt/lfs/sources/binutils-build/ld'
make: Leaving directory `/mnt/lfs/sources/binutils-build/ld'
[lfs@corellia binutils-build]$ make -C ld LIB_PATH=/usr/lib:/lib

...

r.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldwrite.o ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o ldcref.o plugin.o eelf_x86_64.o eelf32_x86_64.o eelf_i386.o ei386linux.o eelf_l1om.o eelf_k1om.o  ../bfd/.libs/libbfd.a ../libiberty/libiberty.a -ldl
make[2]: Leaving directory `/mnt/lfs/sources/binutils-build/ld'
make[1]: Leaving directory `/mnt/lfs/sources/binutils-build/ld'
make: Leaving directory `/mnt/lfs/sources/binutils-build/ld'
[lfs@corellia binutils-build]$ cp -v ld/ld-new /tools/bin
'ld/ld-new' -> '/tools/bin/ld-new'
[lfs@corellia binutils-build]$

Y con esto puedo dar por terminada la compilación de binutils en el sistema temporal.

[lfs@corellia binutils-build]$ cd ..
[lfs@corellia sources]$ rm -rf binutils-build/ binutils-2.22
[lfs@corellia sources]$

Compilando gcc (segundo paso)

Este paso ya no es tan facil. Hay que hacer algunos ajustes antes de compilar. Primero hay que crear el fichero limits.h porque el que ha creado en el paso anterior está incompleto.

[lfs@corellia sources]$ cd gcc-4.7.1
[lfs@corellia gcc-4.7.1]$ cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
>   `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
[lfs@corellia gcc-4.7.1]$

El siguiente paso es modificar el Makefile para que use el flag -fomit-frame-pointer. Esto asegura que el compilador sea capaz de compilarse a sí mismo, cosa que será necesaria más adelante.

[lfs@corellia gcc-4.7.1]$ cp -v gcc/Makefile.in{,.tmp}
'gcc/Makefile.in' -> 'gcc/Makefile.in.tmp'
[lfs@corellia gcc-4.7.1]$ sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
>   > gcc/Makefile.in
[lfs@corellia gcc-4.7.1]$

Como ya tenía el directorio preparado del paso anterior, puedo saltarme los siguientes comandos que trae el libro, que son los mismos que ya lancé anteriormente, e ir a la parte en la que se configura el código fuente y se empieza a compilar.

[lfs@corellia gcc-4.7.1]$ cd ../gcc-build/
[lfs@corellia gcc-build]$ CC=$LFS_TGT-gcc \
> AR=$LFS_TGT-ar                  \
> RANLIB=$LFS_TGT-ranlib          \
> ../gcc-4.7.1/configure          \
>     --prefix=/tools             \
>     --with-local-prefix=/tools  \
>     --with-native-system-header-dir=/tools/include \
>     --enable-clocale=gnu        \
>     --enable-shared             \
>     --enable-threads=posix      \
>     --enable-__cxa_atexit       \
>     --enable-languages=c,c++    \
>     --disable-libstdcxx-pch     \
>     --disable-multilib          \
>     --disable-bootstrap         \
>     --disable-libgomp           \
>     --with-mpfr-include=$(pwd)/../gcc-4.7.1/mpfr/src \
>     --with-mpfr-lib=$(pwd)/mpfr/src/.libs
[lfs@corellia gcc-build]$

El configure no hace nada. Simplemente muestra otra vez el prompt. Mejor volver a descomprimir el fuente desde el principio. Lo malo es que ahora tengo que repetir todos los pasos. Los pongo rápido.

[lfs@corellia gcc-build]$ cd ..  
[lfs@corellia sources]$ rm -rf gcc-4.7.1
[lfs@corellia sources]$ tar xvjf gcc-4.7.1.tar.bz2

...

gcc-4.7.1/gcc/tree-ssa-phiprop.c
gcc-4.7.1/gcc/gsstruct.def
gcc-4.7.1/gcc/combine.c
gcc-4.7.1/gcc/input.h
gcc-4.7.1/ltsugar.m4
[lfs@corellia sources]$ cd gcc-4.7.1
[lfs@corellia gcc-4.7.1]$ cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
>   `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
[lfs@corellia gcc-4.7.1]$ cp -v gcc/Makefile.in{,.tmp}
'gcc/Makefile.in' -> 'gcc/Makefile.in.tmp'
[lfs@corellia gcc-4.7.1]$ sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
>   > gcc/Makefile.in
[lfs@corellia gcc-4.7.1]$ sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
>   > gcc/Makefile.in
[lfs@corellia gcc-4.7.1]$ for file in \
>  $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
> do
>   cp -uv $file{,.orig}
>   sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
>   -e 's@/usr@/tools@g' $file.orig > $file
>   echo '
> #undef STANDARD_STARTFILE_PREFIX_1
> #undef STANDARD_STARTFILE_PREFIX_2
> #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
> #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
>   touch $file.orig
> done
'gcc/config/rs6000/linux64.h' -> 'gcc/config/rs6000/linux64.h.orig'
'gcc/config/rs6000/linux.h' -> 'gcc/config/rs6000/linux.h.orig'
'gcc/config/rs6000/sysv4.h' -> 'gcc/config/rs6000/sysv4.h.orig'

...

'gcc/config/sparc/linux.h' -> 'gcc/config/sparc/linux.h.orig'
'gcc/config/sparc/sysv4.h' -> 'gcc/config/sparc/sysv4.h.orig'
'gcc/config/vax/linux.h' -> 'gcc/config/vax/linux.h.orig'
[lfs@corellia gcc-4.7.1]$ tar -Jxf ../mpfr-3.1.1.tar.xz
[lfs@corellia gcc-4.7.1]$ mv -v mpfr-3.1.1 mpfr
'mpfr-3.1.1' -> 'mpfr'
[lfs@corellia gcc-4.7.1]$ tar -Jxf ../gmp-5.0.5.tar.xz
[lfs@corellia gcc-4.7.1]$ mv -v gmp-5.0.5 gmp
'gmp-5.0.5' -> 'gmp'
[lfs@corellia gcc-4.7.1]$ tar -zxf ../mpc-1.0.tar.gz
[lfs@corellia gcc-4.7.1]$ mv -v mpc-1.0 mpc
'mpc-1.0' -> 'mpc'
[lfs@corellia gcc-4.7.1]$ cd ../gcc-build
[lfs@corellia gcc-build]$ CC=$LFS_TGT-gcc \
> AR=$LFS_TGT-ar                  \
> RANLIB=$LFS_TGT-ranlib          \
> ../gcc-4.7.1/configure          \
>     --prefix=/tools             \
>     --with-local-prefix=/tools  \
>     --with-native-system-header-dir=/tools/include \
>     --enable-clocale=gnu        \
>     --enable-shared             \
>     --enable-threads=posix      \
>     --enable-__cxa_atexit       \
>     --enable-languages=c,c++    \
>     --disable-libstdcxx-pch     \
>     --disable-multilib          \
>     --disable-bootstrap         \
>     --disable-libgomp           \
>     --with-mpfr-include=$(pwd)/../gcc-4.7.1/mpfr/src \
>     --with-mpfr-lib=$(pwd)/mpfr/src/.libs

...

checking whether to enable maintainer-specific portions of Makefiles... no
checking whether -fkeep-inline-functions is supported... yes
configure: creating ./config.status
config.status: creating Makefile
[lfs@corellia gcc-build]$

Ahora sí que ha funcionado. Continúo con la compilación.

[lfs@corellia gcc-build]$ make

...

libtool: link: /tools/x86_64-unknown-linux-gnu/bin/ranlib .libs/libitm.a
libtool: link: ( cd ".libs" && rm -f "libitm.la" && ln -s "../libitm.la" "libitm.la" )
make[4]: Leaving directory `/mnt/lfs/sources/gcc-build/x86_64-unknown-linux-gnu/libitm'
make[3]: Leaving directory `/mnt/lfs/sources/gcc-build/x86_64-unknown-linux-gnu/libitm'
make[2]: Leaving directory `/mnt/lfs/sources/gcc-build/x86_64-unknown-linux-gnu/libitm'
make[1]: Leaving directory `/mnt/lfs/sources/gcc-build'
[lfs@corellia gcc-build]$ make install

...

make[4]: Nothing to be done for `install-data-am'.
make[4]: Leaving directory `/mnt/lfs/sources/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3'
make[3]: Leaving directory `/mnt/lfs/sources/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3'
make[2]: Leaving directory `/mnt/lfs/sources/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3'
make[1]: Leaving directory `/mnt/lfs/sources/gcc-build'
[lfs@corellia gcc-build]$

Se puede ver cómo las opciones del configure son distintas que en las del primer paso. En particular, me llama la atención ver que ahora aparece C++ entre los lenguajes generados.

Ahora sólo faltaría crear un enlace para que los programas que llaman al compilador a través del comando “cc” usen “gcc“.

[lfs@corellia gcc-build]$ ln -vs gcc /tools/bin/cc
'/tools/bin/cc' -> 'gcc'
[lfs@corellia gcc-build]$

Después de esto hay que volver a comprobar que el compilador funciona correctamente. Si este pequeño test no funciona, tendría que revisar todo lo que he hecho. El test es el mismo que he lanzado cuando compilé glibc.

[lfs@corellia gcc-build]$ echo 'main(){}' > dummy.c
[lfs@corellia gcc-build]$ cc dummy.c
[lfs@corellia gcc-build]$ readelf -l a.out | grep ': /tools'
      [Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
[lfs@corellia gcc-build]$ rm -v dummy.c a.out
removed 'dummy.c'
removed 'a.out'
[lfs@corellia gcc-build]$

Perfecto. Ya tengo binutils y el gcc terminados para el sistema temporal. El proceso ha vuelto a tardar el doble de lo esperado, 14 minutos 30 segundos. No sé a qué se debe, pero he calculado el nuevo SBU, que es de 2.04. A ver en las próximas compilaciones cuál resulta ser el SBU más preciso. En el próximo post continuamos con tcl.

EOF

Anuncios