Detaljer om denne pakken finner du i Seksjon 8.31.2, «Innhold i GCC»
GCC pakken inneholder GNU kompilatorsamlingen, som inkluderer C og C++ kompilatorene.
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.:
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
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
-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:
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»