5.3. GCC-15.2.0 - Pass 1

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

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

5.3.1. Installasjon av Kryss GCC

GCC krever pakkene GMP, MPFR og MPC. Siden disse pakkene kanskje ikke er inkludert i vertsdistribusjonen din, vil de bli 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.:

[Notat]

Notat

Det er ofte misforståelser om dette kapittelet. Fremgangsmåtene er de samme som i alle andre kapitler, som forklart tidligere. (Instruksjoner for pakkebygging). Først, pakk ut gcc-15.2.0 tarball fra kildemappen og deretter endre til mappen som ble opprettet. Først da bør du fortsette med instruksjonene nedenfor.

tar -xf ../mpfr-4.2.2.tar.xz
mv -v mpfr-4.2.2 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.4.0.tar.xz
mv -v mpc-1.4.0 mpc

Endre standard mappenavn for biblioteker:

sed -e '/m64=/s/lib64/lib/' \
    -e '/m32=/s/m32=.*/m32=..\/lib32$(call if_multiarch,:i386-linux-gnu)/' \
    -i.orig gcc/config/i386/t-linux64
[Notat]

Notat

Dette eksemplet demonstrerer bruken av -i.orig bryteren. Den gjør at sed kopier t-linux64 filen til t-linux64.orig, og deretter redigere den originale t-linux64 filen. Så du kan kjøre diff -u gcc/config/i386/t-linux64{.orig,} for å visualisere endringen som er gjort av sed kommandoen etterpå. Vi bruker ganske enkelt -i (som bare redigerer den opprinnelige filen uten å kopiere den) for alle andre pakker i boken, men du kan endre den til -i.orig hvis du beholde en kopi av den opprinnelige filen.

Gjør -mstackrealign standard for 32-bit objekter:

sed '/STACK_REALIGN_DEFAULT/s/0/(!TARGET_64BIT \&\& TARGET_SSE)/' \
      -i gcc/config/i386/i386.h
[Notat]

Notat

-mstackrealign har et spesielt formål for 32-bit. Alle applikasjoner har en stakkrammejustering. Vanligvis i gamle applikasjoner (og også noen applikasjoner i dagens tidsalder) som er bygget for 32-bit, vanligvis for Windows, har de en stakkrammejustering på 4 byte. x86 System V ABI prosessor Tillegget krever at både 32-bit og 64-bit applikasjoner har en stakkrammejustering på 16 byte.

Justeringen av stakkrammen er nødvendig for x86 assembleren movaps og movdqa instruksjoner skal virke, som brukes som raskere alternativer til movups. Når justeringen av stabelrammen ikke er riktig, vil disse monteringsinstruksjonene utløse en generell beskyttelsesfeil, noe som fører til en SIGSEGV kill signal.

For å forhindre dette, -mstackrealign tilbyr forskjellige potensielle stakkrammejusteringer om nødvendig. For å sikre at all programvare har en god stakkrammejustering, er hver pakke kompilert med -mstackrealign, som gjør det til standard for målretting av 32-bit. Glibc er den viktigste som trenger det.

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.43    \
    --with-sysroot=$LFS          \
    --with-newlib                \
    --without-headers            \
    --enable-default-pie         \
    --enable-default-ssp         \
    --enable-initfini-array      \
    --disable-nls                \
    --disable-shared             \
    --enable-multilib            \
    --with-multilib-list=m64,m32 \
    --disable-decimal-float      \
    --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.43

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 merknad om PIE og 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.

--enable-multilib --with-multilib-list=...

Disse parameterne aktiverer både multilib og hvilke arkitekturer som skal støttes.

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

Disse bryterne deaktiverer støtte for threading, libatomic, libgomp, libquadmath, libssp, 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:

[Notat]

Notat

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)`/include/limits.h

Detaljer om denne pakken finner du i Seksjon 8.31.2, «Innhold i GCC»