Detaljer om denne pakken finner du i Seksjon 8.30.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.1.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.3.1.tar.gz mv -v mpc-1.3.1 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
Gjør -mstackrealign
som standard for
32bit objekter:
sed '/STACK_REALIGN_DEFAULT/s/0/(!TARGET_64BIT \&\& TARGET_SSE)/' \ -i gcc/config/i386/i386.h
Å legge til -mstackrealign
flagg som
standard hjelper med å løse problemer med gamle binærfiler som
ikke kan kompileres på nytt på det faktiske operativsystemet.
I dag krever x86-32 SysV psABI (brukt av alle Linux-programmer)
en 16-byte justering av stakkrammen, så rutinene som bruker SSE
vil lagre/laste SSE vektorer på/fra stakken ved hjelp av en
movaps
instruksjon (som bare
fungerer med justerte adresser, men raskere enn motparten som
tillater ujusterte adresser, movups
).
Men noen virkelig gamle x86-32 Linux binærfiler (kompilert for
omtrent 15 år siden), og alle Windows x86-32 binærfiler som kan
kjøres via Wine eller
Steam justerer bare stakkrammen
til 4 byte. Dermed, når den kaller en SSE rutine i LFS bygget
uten -mstackrealign
, movdqa
instruksjonen mislykkes med en generell
beskyttelsesfeil, og Linux kjernen avslutter prosessen med en
SIGSEGV.
GCC dokumentasjonen anbefaler å bygge GCC i en dedikert byggemappe:
mkdir -v build cd build
Forbered GCC for kompilering:
mlist=m64,m32,mx32 ../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ --with-glibc-version=2.41 \ --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=$mlist \ --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.41
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.
--disable-multilib
På x86_64 støtter LFS ikke en multilib konfigurasjon. Denne bryteren er ufarlig for x86.
--enable-multilib
--with-multilib-list=...
LFS kan brukes til å støtte multilib. Hvilke de er, er spesifisert i multilib listen.
--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.30.2, «Innhold i GCC»