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...
Rien à signaler.
Rien à signaler.
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 temporairePour le détail des options de gcc
, la documentation est là.
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,..