5.12. GCC-7.1.0 croisé - Statique

Le paquet GCC contient la collection de compilateurs GNU, qui contient les compilateurs C et C++.

5.12.1. Installation de Cross GCC Compiler with Static libgcc and no Threads

Ici nous allons compiler GCC, en tant que compilateur croisé qui créera des exécutables pour notre architecture cible, statiquement pour qu'il n'ait pas besoin de chercher les fichiers de démarrage de Glibc, qui n'existent pas encore dans /tools. Nous utiliserons ce compilateur croisé, plus l'éditeur de liens croisé que nous venons d'installer avec Binutils, pour compiler Glibc. Après l'installation de Glibc dans /tools, nous pourrons reconstruire GCC pour qu'il puisse construire des exécutables qui se lient aux bibliothèques dans /tools.

Faites quelques ajustements essentiels pour le fichier specs de GCC pour vous assurer que GCC utilise notre environnement de construction :

patch -Np1 -i ../gcc-7.1.0-specs-1.patch

Modifiez la spec StartFile afin que GCC regarde dans /tools :

echo -en '\n#undef STANDARD_STARTFILE_PREFIX_1\n#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"\n' >> gcc/config/linux.h
echo -en '\n#undef STANDARD_STARTFILE_PREFIX_2\n#define STANDARD_STARTFILE_PREFIX_2 ""\n' >> gcc/config/linux.h

Nous allons créer un faux limits.h pour que la construction n'utilise pas celui fourni par la distrib hôte :

touch /tools/include/limits.h

La documentation de GCC recommande de construire GCC en dehors du répertoire des sources dans un répertoire dédié :

mkdir -v ../gcc-build
cd ../gcc-build

Préparez la compilation de GCC :

AR=ar \
LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
../gcc-7.1.0/configure \
    --prefix=/cross-tools \
    --build=${CLFS_HOST} \
    --host=${CLFS_HOST} \
    --target=${CLFS_TARGET} \
    --with-sysroot=${CLFS} \
    --with-local-prefix=/tools \
    --with-native-system-header-dir=/tools/include \
    --disable-shared \
    --with-mpfr=/cross-tools \
    --with-gmp=/cross-tools \
    --with-mpc=/cross-tools \
    --without-headers \
    --with-newlib \
    --disable-decimal-float \
    --disable-libgomp \
    --disable-libssp \
    --disable-libatomic \
    --disable-libitm \
    --disable-libsanitizer \
    --disable-libquadmath \
    --disable-libvtv \
    --disable-libcilkrts \
    --disable-libstdc++-v3 \
    --disable-threads \
    --with-isl=/cross-tools \
    --enable-languages=c \
    --with-glibc-version=2.25

Voici la signification des nouvelles options de configure :

--build=${CLFS_HOST}

Cela spécifie le système sur lequel le compilateur croisé est construit.

--with-local-prefix=/tools

Le but de ce paramètre est de supprimer /usr/local/include du chemin de recherche d'en-têtes de gcc. Ce n'est pas absolument nécessaire, mais cela aide à minimiser l'influence du système hôte.

--with-native-system-headers-dir=/tools/include

Ce paramètre s'assure que GCC cherchera les en-têtes système dans /tools/include et qu'il ne cherchera pas dans les en-têtes du système hôte.

--disable-shared

Cela dit à GCC de ne pas créer de bibliothèque partagée.

--without-headers

Désactive l'utilisation de la Libc de la cible par GCC lors de la compilation croisée.

--with-newlib

Cela fait que GCC active le drapeau inhibit_libc, qui évite que libgcc ne construise du code qui utilise le support de la libc.

--disable-decimal-float

Désactive le support pour l'extension de point flottant en C.

--disable-lib*

Ces options évitent que GCC ne construire un certain nombre de bibliothèques qui ne sont pas encore requises.

--disable-threads

Cela évitera que GCC ne cherche les fichiers d'en-tête multi-thread, comme ils n'ont pas encore été créés pour cette architecture. GCC pourra trouver les informations de multi-thread après la création des en-têtes de Glibc.

--with-system-zlib

Cela dit à GCC de se lier au zlib du système plutôt que celui dans son arborescence des sources.

--enable-languages=c

Cette option s'assure que seul le compilateur C est construit.

--with-glibc-version=2.25

Requis lors du bootstrapping d'une chaîne croisée sans les fichiers d'en-têtes disponibles pour construire le compilateur initial.

Continuez en compilant le paquet :

make all-gcc all-target-libgcc

Voici la signification des nouvelles options de make :

all-gcc all-target-libgcc

Compile seulement les parties de GCC qui sont requises à ce moment, plutôt que le paquet complet.

Installez le paquet :

make install-gcc install-target-libgcc

Des détails sur ce paquet se trouvent sur Section 10.26.2, « Contenu de GCC. »