6.12. GCC-4.0.3

Il pacchetto GCC contiene la collezione di compilatori GNU, che include i compilatori C e C++.

Tempo di costruzione approssimativo: 22 SBU inclusa la suite di test
Spazio necessario su disco: 566 MB inclusa la suite di test

6.12.1. Installazione di GCC

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
[Importante]

Importante

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

6.12.2. Contenuti di GCC

Programmi installati: c++, cc (link a gcc), cpp, g++, gcc, gccbug e gcov
Librerie installate: libgcc.a, libgcc_eh.a, libgcc_s.so, libstdc++.[a,so] e libsupc++.a

Brevi descrizioni

cc

Il compilatore C

cpp

Il preprocessore C; è usato dal compilatore per espandere le dichiarazioni #include, #define e simili nei file sorgenti

c++

Il compilatore C++

g++

Il compilatore C++

gcc

Il compilatore C

gccbug

Uno shell script usato per aiutare a creare utili report dei bug

gcov

Tool di coverage testing; è usato per analizzare i programmi e determinare dove le ottimizzazioni avranno il maggior effetto

libgcc

Contiene il supporto run-time per gcc

libstdc++

La libreria standard C++

libsupc++

Fornisce routine di supporto per il linguaggio di programmazione C++