Il pacchetto GCC contiene la collezione di compilatori GNU, che include i compilatori C e C++.
Applicare una sostituzione sed che sopprimerà l'installazione di libiberty.a. In sostituzione verrà utilizzata la versione di libiberty.a fornita da Binutils:
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
La costruzione bootstrap eseguita in Sezione 5.4, «GCC-4.0.3 - Passo 1» ha creato GCC con il flag di compilazione -fomit-frame-pointer. Le costruzioni non-bootstrap omettono questo flag per default, quindi applicare il sed seguente per usarlo e così garantire delle costruzioni di compilazione coerenti.
sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
È noto che a volte lo script fixincludes cerca erroneamente di "correggere" gli header di sistema finora installati. Poiché si sa che gli header installati da GCC-4.0.3 e Glibc-2.3.6 non richiedono correzioni, digitare il seguente comando per impedire l'esecuzione dello script fixincludes:
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
GCC fornisce uno script gccbug che durante la compilazione rileva se è presente mktemp e codifica il risultato in un test. Questo farà sì che lo script tornerà ad usare meno nomi casuali per i file temporanei. Instelleremo mktemp più tardi, perciò il seguente sed simulerà la sua presenza.
sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
La documentazione di GCC raccomanda di costruire GCC fuori dalla directory dei sorgenti in una directory dedicata:
mkdir -v ../gcc-build cd ../gcc-build
Preparare GCC per la compilazione:
../gcc-4.0.3/configure --prefix=/usr \ --libexecdir=/usr/lib --enable-shared \ --enable-threads=posix --enable-__cxa_atexit \ --enable-clocale=gnu --enable-languages=c,c++
Compilare il pacchetto:
make
La suite di test per GCC in questa sezione è considerata critica. Non saltarla per nessuna ragione.
Testare i risultati, ma senza bloccarsi sugli errori:
make -k check
Per avere un sommario dei risultati della suite di test, eseguire:
../gcc-4.0.3/contrib/test_summary
Solo per i sommari, eseguire il pipe dell'output con grep -A7 Summ.
I risultati possono essere confrontati con quelli in http://www.linuxfromscratch.org/lfs/build-logs/6.2/.
Non sempre è possibile evitare alcuni fallimenti. Gli sviluppatori di GCC di solito sono consapevoli di questi problemi, ma non li hanno ancora risolti. In particolare, è noto che i test libmudflap sono particolarmente problematici a causa di un bug in GCC (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003). A meno che i risultati dei test non siano enormemente diversi da quelli all'URL precedente, si può continuare tranquillamente.
Installare il pacchetto:
make install
Alcuni pacchetti si aspettano che il preprocessore C sia installato nella directory /lib. Per supportare questi pacchetti creare questo link simbolico:
ln -sv ../usr/bin/cpp /lib
Molti pacchetti usano il nome cc per chiamare il compilatore C. Per soddisfare questi pacchetti creare un link simbolico:
ln -sv gcc /usr/bin/cc
Ora che la nostra toolchain finale è posizionata, è importante assicurarsi di nuovo che la compilazione e il linking funzionino come previsto. Facciamo questo eseguendo gli stessi controlli di integrità che abbiamo fatto prima nel capitolo:
echo 'main(){}' > dummy.c cc dummy.c -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Se tutto funziona correttamente, non dovrebbero esserci errori e l'output dell'ultimo comando sarà (ad eccezione di differenze nel nome del linker dinamico dipendenti dalla piattaforma):
[Requesting program interpreter: /lib/ld-linux.so.2]
Ora assicurarsi di essere configurati in modo da usare gli startfile corretti:
grep -o '/usr/lib.*/crt[1in].* .*' dummy.log
Se tutto funziona correttamente non dovrebbero esserci errori e l'output dell'ultimo comando sarà:
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crt1.o succeeded /usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crti.o succeeded /usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crtn.o succeeded
Quindi verificare che il nuovo linker venga usato con i path di ricerca corretti:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Se tutto funziona correttamente, non dovrebbero esserci errori e l'output dell'ultimo comando sarà:
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");
Poi assicurarsi che stiamo usando la libc corretta:
grep "/lib/libc.so.6 " dummy.log
Se tutto funziona correttamente, non dovrebbero esserci errori e l'output dell'ultimo comando sarà:
attempt to open /lib/libc.so.6 succeeded
Infine assicurarsi che GCC stia usando il linker dinamico corretto:
grep found dummy.log
Se tutto funziona correttamente, non dovrebbero esserci errori e l'output dell'ultimo comando sarà (ad eccezione di differenze nel nome del linker dinamico dipendenti dalla piattaforma):
found ld-linux.so.2 at /lib/ld-linux.so.2
Se l'output non appare come mostrato sopra o non si è ricevuto alcun output, allora si è verificato qualche errore grave. Bisogna investigare e ripercorrere i propri passi per trovare dove è il problema e correggerlo. La ragione più probabile è che qualcosa sia andato storto nella correzione del file specs. Tutti i problemi dovranno essere risolti prima di poter continuare nel processo.
Appena tutto funziona correttamente cancellare i file di test:
rm -v dummy.c a.out dummy.log