8.26.1. Installasjon av GCC
Først må du fikse et problem som forhindrer libasan.a
å bygge denne pakken med Glibc-2.34
eller nyere:
sed -e '/static.*SIGSTKSZ/d' \
-e 's/return kAltStackSize/return SIGSTKSZ * 4/' \
-i libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp
Hvis du bygger på x86_64, endre standard katalognavn for 64-bit
bibliotekene 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 --prefix=/usr \
LD=ld \
--enable-languages=c,c++ \
--disable-multilib \
--disable-bootstrap \
--with-system-zlib
Merk at for andre programmeringsspråk er det noen forutsetninger
som ikke er tilgjengelig ennå. Se BLFS
Bokens GCC side for instruksjoner om hvordan du bygger alle
GCCs støttede språk.
Betydningen av de nye konfigureringsparametrene:
-
LD=ld
-
Denne parameteren gjør at konfigureringsskriptet bruker ld
installert av binutils bygget tidligere i dette kapittelet, i
stedet for den kryssbygde versjonen som ellers ville blitt
brukt.
-
--with-system-zlib
-
Denne bryteren forteller GCC å koble til den
systeminstallerte kopien av zlib biblioteket, i stedet for
sin egen interne kopi.
Kompiler pakken:
make
Important
I denne delen vurderes testpakken for GCC å være viktig, men det
tar lang tid. Førstegangsbyggere oppfordres til ikke å hoppe over
dette. Tiden for å kjøre testene kan bli redusert betydelig ved å
legge til -jx i make kommandoen nedenfor hvor x er antall kjerner
på systemet ditt.
Et sett med tester i GCC testpakken er kjent for å bruke opp
standard stabel (stack), så øk stabelstørrelsen før du kjører
testene:
ulimit -s 32768
Test resultatene som en ikke-privilegert bruker, men ikke stopp ved
feil:
chown -Rv tester .
su tester -c "PATH=$PATH make -k check"
For å motta et sammendrag av resultatene til testpakken, kjør:
../contrib/test_summary
For bare sammendragene, kanaliser utdataene gjennom grep -A7 Summ
.
Resultatene kan sammenlignes med de som ligger på https://www.linuxfromscratch.org/lfs/build-logs/11.1/
og https://gcc.gnu.org/ml/gcc-testresults/.
Åtte tester relatert til analyzer er kjent for å mislykkes.
En test med navnet asan_test.C
er
kjent for mislykkes.
I libstdc++ en test med navnet 49745.cc
er kjent for å mislykkes fordi
deklarasjonsavhengighetene i glibc er endret.
I libstdc++ er en numpunct test og seks tester relatert til
get_time kjent for å mislykkes. Dette er fordi
lokalitetsdefinisjonene i glibc er endret, men libstdc++ støtter
for øyeblikket ikke disse endringene.
Noen få uventede feil kan ikke alltid unngås. GCC utviklerne er
vanligvis klar over disse problemene, men har ikke løst dem ennå.
Med mindre testresultatene er svært forskjellige fra de på URLen
ovenfor, er det trygt å fortsette.
Installer pakken og fjern en unødvendig mappe:
make install
rm -rf /usr/lib/gcc/$(gcc -dumpmachine)/11.2.0/include-fixed/bits/
GCC byggekatalogen eies av tester
nå og eierskapet til den installerte deklarasjonsmappen (og dens
innhold) vil være feil. Endre eierskapet til root
bruker og gruppe:
chown -v -R root:root \
/usr/lib/gcc/*linux-gnu/11.2.0/include{,-fixed}
Lag en symbolkobling som kreves av FHS
av "historiske" grunner.
ln -svr /usr/bin/cpp /usr/lib
Legg til en kompatibilitetssymbolkobling for å aktivere
byggeprogrammer med optimalisering av koblingstid (LTO):
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/11.2.0/liblto_plugin.so \
/usr/lib/bfd-plugins/
Nå som vår endelige verktøykjede er på plass, er det viktig å sikre
at kompilering og kobling vil fungere som forventet. Dette gjør vi
ved å utføre noen sunnhetssjekker:
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
Det skal ikke være noen feil, og utdataen av den siste kommandoen
vil være (som gir rom for plattformspesifikke forskjeller i det
dynamiske linkernavnet):
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Sørg nå for at vi er konfigurert til å bruke de riktige
startfilene:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
Utdata fra den siste kommandoen skal være:
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crtn.o succeeded
Avhengig av maskinarkitekturen din, kan ovenstående avvike litt.
Forskjellen vil være navnet på mappen etter /usr/lib/gcc
. Det viktige å se etter her er det
at gcc har funnet
alle tre crt*.o
filene under
/usr/lib
mappen.
Kontroller at kompilatoren søker etter riktige deklarasjons filer:
grep -B4 '^ /usr/include' dummy.log
Denne kommandoen skal returnere følgende utdata:
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include-fixed
/usr/include
Igjen, mappen oppkalt etter måltripletten kan være annerledes enn
de ovennevnte, avhengig av systemarkitekturen.
Deretter kontrollerer du at den nye linkeren brukes med de riktige
søkebanene:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Referanser til stier som har komponenter med '-linux-gnu' bør
ignoreres, men ellers skal utdataene fra den siste kommandoen være:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
Et 32-bits system kan se noen forskjellige kataloger. For eksempel
her er utdata fra en i686-maskin:
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32")
SEARCH_DIR("/usr/local/lib32")
SEARCH_DIR("/lib32")
SEARCH_DIR("/usr/lib32")
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
Deretter må du kontrollere at vi bruker riktig libc:
grep "/lib.*/libc.so.6 " dummy.log
Utdata fra den siste kommandoen skal være:
attempt to open /usr/lib/libc.so.6 succeeded
Sørg for at GCC bruker riktig dynamisk linker:
grep found dummy.log
Utdataene fra den siste kommandoen skal være (tillater
plattformspesifikke forskjeller i dynamisk linkernavn):
found ld-linux-x86-64.so.2 at /usr/lib/ld-linux-x86-64.so.2
Hvis utdataene ikke vises som vist ovenfor eller ikke mottas i det
hele tatt, så er det noe alvorlig galt. Undersøk og gå gjennom
trinn for trinn, for å finne ut hvor problemet er og rette det.
Alle problemer må løses før du fortsetter med prosessen.
Når alt fungerer som det skal, rydd opp i testfilene:
rm -v dummy.c a.out dummy.log
Til slutt flytter du en feilplassert fil:
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib