Vous êtes ici

LFS : construction du système

Passons maintenant à la deuxième partie : la construction du système final (partie 6 de la doc).

A partir de maintenant, les commandes sont à passer depuis l'utilisateur root.

Après avoir fait un chroot, on repart sur les compilations...

Linux LibC Headers

Rien à signaler.

Man pages

Rien à signaler.

Glibc

Pour info, voici le fichier log de la construction, et celui des tests.

Pour la construction, pas d'erreur reportée. Par contre, pour les tests, plusieurs erreurs, principalement pour la partie math... Voici un extrait concernant l'une des erreurs :

gcc test-float.c -c -std=gnu99 -O2 -Wall -Winline -Wstrict-prototypes -Wwrite-strings -g 
  -mpreferred-stack-boundary=4  -fno-inline -ffloat-store -fno-builtin  -Wno-uninitialized 
  -D__NO_MATH_INLINES -D__LIBC_INTERNAL_MATH_INLINES -I../include -I. -I/sources/glibc-build/math 
  -I.. -I../libio -I../nptl -I/sources/glibc-build -I../sysdeps/i386/elf 
  -I../nptl/sysdeps/unix/sysv/linux/i386/i686 -I../nptl/sysdeps/unix/sysv/linux/i386 
  -I../nptl/sysdeps/unix/sysv/linux -I../nptl/sysdeps/pthread -I../sysdeps/pthread 
  -I../nptl/sysdeps/unix/sysv -I../nptl/sysdeps/unix -I../nptl/sysdeps/i386/i686 
  -I../nptl/sysdeps/i386 -I../sysdeps/unix/sysv/linux/i386 -I../sysdeps/unix/sysv/linux 
  -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet 
  -I../sysdeps/unix/sysv/i386 -I../sysdeps/unix/sysv -I../sysdeps/unix/i386 -I../sysdeps/unix 
  -I../sysdeps/posix -I../sysdeps/i386/i686/fpu -I../sysdeps/i386/i686 -I../sysdeps/i386/i486 
  -I../nptl/sysdeps/i386/i486 -I../sysdeps/i386/fpu -I../sysdeps/i386 -I../sysdeps/wordsize-32 
  -I../sysdeps/ieee754/ldbl-96 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754/flt-32 
  -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -nostdinc -isystem 
  /tools/lib/gcc/i686-pc-linux-gnu/3.4.1/include -isystem /tools/glibc-kernheaders 
  -D_LIBC_REENTRANT -D_LIBC_REENTRANT -include ../include/libc-symbols.h   -DNOT_IN_libc=1    
  -o /sources/glibc-build/math/test-float.o -MD -MP -MF /sources/glibc-build/math/test-float.o.dt 
  -MT /sources/glibc-build/math/test-float.o

gcc -nostdlib -nostartfiles -o /sources/glibc-build/math/test-float  
  -Wl,-dynamic-linker=/lib/ld-linux.so.2   -Wl,-z,combreloc -Wl,-z,relro 
  /sources/glibc-build/csu/crt1.o /sources/glibc-build/csu/crti.o 
  `gcc --print-file-name=crtbegin.o` /sources/glibc-build/math/test-float.o 
  /sources/glibc-build/math/libm.so.6  
  -Wl,-rpath-link=/sources/glibc-build:/sources/glibc-build/math:/sources/glibc-build/elf:
    /sources/glibc-build/dlfcn:/sources/glibc-build/nss:/sources/glibc-build/nis:
    /sources/glibc-build/rt:/sources/glibc-build/resolv:/sources/glibc-build/crypt:
    /sources/glibc-build/nptl /sources/glibc-build/libc.so.6 /sources/glibc-build/libc_nonshared.a 
  -lgcc -Wl,--as-needed -lgcc_s -Wl,--no-as-needed `gcc --print-file-name=crtend.o` 
  /sources/glibc-build/csu/crtn.o

GCONV_PATH=/sources/glibc-build/iconvdata LC_ALL=C   /sources/glibc-build/elf/ld-linux.so.2 
  --library-path 
    /sources/glibc-build:/sources/glibc-build/math:/sources/glibc-build/elf:
    /sources/glibc-build/dlfcn:/sources/glibc-build/nss:/sources/glibc-build/nis:
    /sources/glibc-build/rt:/sources/glibc-build/resolv:/sources/glibc-build/crypt:
    /sources/glibc-build/nptl /sources/glibc-build/math/test-float  > 
  /sources/glibc-build/math/test-float.out

/bin/sh: line 1:  1325 Illegal instruction     GCONV_PATH=/sources/glibc-build/iconvdata LC_ALL=C 
  /sources/glibc-build/elf/ld-linux.so.2 --library-path 
  /sources/glibc-build:/sources/glibc-build/math:/sources/glibc-build/elf:/sources/glibc-build/dlfcn:
  /sources/glibc-build/nss:/sources/glibc-build/nis:/sources/glibc-build/rt:
  /sources/glibc-build/resolv:/sources/glibc-build/crypt:/sources/glibc-build/nptl 
  /sources/glibc-build/math/test-float >/sources/glibc-build/math/test-float.out

make[2]: *** [/sources/glibc-build/math/test-float.out] Error 132

La même erreur (Illegal instruction) se reproduit pour les tests suivants :

  • test-double
  • test-ldouble
  • st-ildoubl
  • test-ifloat
  • test-idouble
  • tst-tsearch
  • tst-align

Une recherche via Google semble indiquer que le problème pourrait provenir du non-support de l'instruction cmov par le processeur. Un cat /proc/cpuinfo indique qu'il s'agit d'un Samuel 2 dans notre cas.

Le HowTo EPIA fournit la réponse suivante, à la question Le C3 est-il compatible Pentium ? :

Yes. But Samuel 2, Ezra, Ezra T C3 processors have a problem with the cmpxchg8b 
(i.e. CMOV) opcode. Nehemiah and Antaur processors are not affected.

The identification issue is that the C3 is identifying itself as 686. According 
to the Intel IA32 documentation, this is correct: C3 does not implement conditional 
moves*, and do not pretend to implement conditional moves. The Intel documentation 
states that you should check before doing conditional moves, and that cmov 
implementation in the processor is optional. The GNU compiler people have assumed 
that all 686's implement cmov's, so code compiled for the i686 architecture may not 
execute on the C3. Code generated by GCC does not check for these optional features 
as the intel documentation says you should. When downloading binaries for the C3, 
don't go higher than the i586 level. When building, you may want to target the 586 
or even the 486, because of the way the C3 is built internally: It's not an athlon, 
more like a 486-586 cross.

Plutôt que d'utiliser la configuration par défaut de gcc, nous allons donc choisir nous-même les paramètres de compilation :

  • -g : génération des informations de débogage pour GDB (présent dans la configuration par défaut)
  • -O2 : deuxième niveau d'optimisation (présent dans la configuration par défaut)
  • -march=c3 : pour CPU VIA supportant le jeu d'instructions MMX et 3dNOW!
  • -pipe : la communication entre les différentes étapes de la compilation se fait par pipe plutôt que par fichier temporaire

Pour le détail des options de gcc, la documentation est .

Avant de lancer la construction, il faut définir CFLAGS et CXXFLAGS (voir la FAQ optimisation de LFS) :

export CFLAGS="-g -O2 -march=c3 -pipe" &&
CXXFLAGS=$CFLAGS

Résultats des courses : toujours des erreurs pour le make check, cette fois-ci pour les tests suivants :

  • test-float
  • test-double
  • test-ldouble
  • test-ildoubl
  • test-ifloat
  • test-idouble
  • tst-qsort
  • tst-tsearch
  • tst-align

Bien. Voyons ce que cela donne avec CFLAGS et CXXFLAGS définis à

-march=i586 -m3dnow -O3 -pipe -fomit-frame-pointer -mmmx

comme le suggère le HowTo EPIA.

Catastrophe, c'est encore pire ! Une bonne quinzaine d'erreurs...

Et pour une cible i386, idem : des erreurs...

A priori, je pense que le mieux serait de lancer en debug les programmes de test qui posent problème. Mais hélas je ne sais pas encore comment lancer gdb de façon à reproduire les conditions des tests (qui activent les programmes via le loader construit précédemment, en spécifiant bien sûr la glibc toute neuve).

Ce que je décide : je construis la glibc en reposant sur la configuration par défaut, et lorsque tout sera construit (si j'arrive jusque là :-) je viendrai faire un coup de gdb sur les tests de la glibc...

Ba ba baaa : les tests sur la construction de binutils révèlent des erreurs également (fichier log ici). Et une première recherche sur l'internet ne donne pas grand chose...

J'ai le choix : soit je me lance dans le détail du processus de construction de LFS, pour comprendre ce qui se passe. Et j'estime ça à bien 2 ou 3 jours à temps plein... Soit je pars sur autre chose, qui serait la Gentoo, pour ne pas la nommer.

Je connaissais cette distribution de nom, mais sans avoir jamais regardé ses particularités. Je suis tombé dessus récemment lors de mes recherches sur le problème des tests de la glibc. Et ce que j'ai découvert m'a plutôt intéressé : une distribution qui permet également de partir des sources, et de contrôler le contenu de sa configuration. Et qui propose de plus un outil de mise à jour via l'internet. Assez séduisant, a priori. Je vais regarder cela plus en détail,..