5.3. GCC-12.2.0 - Pass 1

GCC pakken inneholder GNU kompilatorsamlingen, som inkluderer C og C++ kompilatorene.

Omtrentlig byggetid: 3.3 SBU
Nødvendig diskplass: 3.8 GB

5.3.1. Installasjon av Cross GCC

GCC krever GMP, MPFR og MPC pakkene. Siden disse pakkene kanskje ikke er inkludert i vertsdistribusjonen din, blir de bygget med GCC. Pakk ut hver pakke i GCC kildemappen, og gi nytt navn til de resulterende mappene slik at GCC byggeprosedyrene automatisk bruker dem:

[Note]

Note

Det er hyppige misforståelser om dette kapittelet. Prosedyrene er de samme som alle andre kapitler som forklart tidligere (Package build instructions). Først pakker du ut gcc-12.2.0 tarballen fra kildemappen , og endre deretter til den opprettede mappen. Først da bør du fortsett med instruksjonene nedenfor.

tar -xf ../mpfr-4.2.0.tar.xz
mv -v mpfr-4.2.0 mpfr
tar -xf ../gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc

På x86_64-verter, sett standard mappenavn for 64-bits biblioteker til lib:

case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
 ;;
esac

GCC dokumentasjonen anbefaler å bygge GCC i en dedikert byggemappe:

mkdir -v build
cd       build

Forbered GCC for kompilering:

../configure                  \
    --target=$LFS_TGT         \
    --prefix=$LFS/tools       \
    --with-glibc-version=2.37 \
    --with-sysroot=$LFS       \
    --with-newlib             \
    --without-headers         \
    --enable-default-pie      \
    --enable-default-ssp      \
    --disable-nls             \
    --disable-shared          \
    --disable-multilib        \
    --disable-threads         \
    --disable-libatomic       \
    --disable-libgomp         \
    --disable-libquadmath     \
    --disable-libssp          \
    --disable-libvtv          \
    --disable-libstdcxx       \
    --enable-languages=c,c++

Betydningen av konfigurasjonsalternativene:

--with-glibc-version=2.37

Dette alternativet spesifiserer versjonen av glibc som vil bli brukt på målet. Det er ikke relevant for vertens libc distribusjon fordi alt kompilert av pass1 gcc vil kjøre i chroot miljøet, som er isolert fra libc til vertens distribusjon.

--with-newlib

Siden et fungerende C bibliotek ikke er tilgjengelig ennå, sikrer dette at inhibit_libc konstanten blir definert når du bygger libgcc. Dette forhindrer kompilering av kode som krever libc støtte.

--without-headers

Når du oppretter en komplett tverrkompilator, krever GCC standarddeklarasjoner som er kompatible med målsystemet. For vårt formål vil disse deklarasjonene ikke være nødvendige. Denne bryteren hindrer GCC i å lete etter dem.

--enable-default-pie and --enable-default-ssp

Disse bryterne lar GCC kompilere programmer med noen herdende sikkerhetsfunksjoner (mer informasjon om de i note on PIE and SSP kapittel 8) som standard. De er strengt tatt ikke nødvendig på dette stadiet, siden kompilatoren bare vil produsere midlertidige kjørbare filer. Men det er renere å ha de midlertidige pakkene så nær de endelige som mulig.

--disable-shared

Denne bryteren tvinger GCC til å koble sine interne biblioteker statisk. Vi trenger dette fordi de delte bibliotekene krever glibc, som ennå ikke er installert på målsystemet.

--disable-multilib

På x86_64 støtter LFS ikke en multilib konfigurasjon. Denne bryteren er ufarlig for x86.

--disable-threads, --disable-libatomic, --disable-libgomp, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx

Disse bryterne deaktiverer støtte for flytende desimal punkter, tråd, libatomic, libgomp, libquadmath, libssp, henholdsvis libvtv og C++ standardbiblioteket. Disse funksjonene klarer ikke å kompilere når du bygger en krysskompilator og er ikke nødvendig for oppgaven med å krysskompilere den midlertidige libc.

--enable-languages=c,c++

Dette alternativet sikrer at bare C og C ++ kompilatorene blir bygget. Dette er de eneste språkene som trengs nå.

Kompiler GCC ved å kjøre:

make

Installer pakken:

make install

Dette bygget av GCC har installert et par interne systemdeklarasjoner. Normalt vil en av dem, limits.h, i sin tur inkludere den tilsvarende system limits.h systemdeklarasjonen, i dette tilfellet, $LFS/usr/include/limits.h. På tidspunktet for denne byggingen av GCC eksisterer imidlertid ikke $LFS/usr/include/limits.h så den interne deklarasjonen som nettopp har blitt installert er en delvis, selvstendig fil og inkluderer ikke de utvidede funksjonene til systemdeklarasjonen. Dette er tilstrekkelig for å bygge glibc, men den fullstendige interne deklarasjonen vil være nødvendig senere. Lag en fullversjon av den interne deklarasjonen ved å bruke en kommando som er identisk med det GCC byggesystemet gjør under normale omstendigheter:

[Note]

Note

Kommandoen nedenfor viser et eksempel på nestet kommandoerstatning ved å bruke to metoder: backquotes og a $() konstruksjon. Det kan skrives om ved å bruke samme metode for begge erstatningene, men vises på denne måten for å demonstrere hvordan de kan blandes. Som regel er $() metoden foretrukket.

cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h

Detaljer om denne pakken finner du i Section 8.26.2, “Innhold i GCC.”