Regolazione della toolchain

Ora che le librerie C provvisorie sono state installate, vogliamo che tutti gli strumenti compilati nel resto di questo capitolo siano linkati verso queste librerie. Per fare questo, dobbiamo sistemare i file specifici del linker e del compilatore.

Dapprima installate il linker adattato (ottenuto al termine del primo passo di Binutils) avviando il seguente comando dall'interno della directory binutils-build:

make -C ld install

D'ora in poi ogni cosa verrà linkata solo verso le librerie in /tools/lib.

[Note]

Nota

Se per qualche ragione non avete dato retta al precedente avvertimento di tenere le directory dei sorgenti e di compilazione delle Binutils dal primo passo o comunque le avete cancellate per errore o semplicemente non potete accedervi, non preoccupatevi, nulla è ancora perduto. Ignorate semplicemente il comando sopra. Il risultato è che c'è una piccola possibilità che i seguenti programmi di test si colleghino alle librerie sull'host. Non è l'ideale, ma non è un grosso problema. La situazione verrà corretta all'installazione del secondo passo delle Binutils, un po' più avanti.

Ora che il linker adattato è installato, dovete rimuovere le directory dei sorgenti e di compilazione delle Binutils.

La prossima cosa da fare è correggere il nostro file di configurazione di GCC in modo che punti al nuovo linker dinamico. Un semplice sed servirà allo scopo:

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
    $SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE

È importante che il comando sopra venga copiato e incollato, piuttosto che digitato manualmente. Oppure potete editare il file di configurazione a mano, se volete: sostituite le occorrenze di “/lib/ld-linux.so.2” con “/tools/lib/ld-linux.so.2”. Controllate il file di configurazione per verificare che le modifiche siano state apportate.

[Important]

Importante

Se state lavorando su una piattaforma in cui il nome del linker dinamico è diverso da ld-linux.so.2, dovrete sostituire ld-linux.so.2 con il nome del linker dinamico della vostra piattaforma nei comandi sopra. Fate riferimento alla sezione chiamata “Note tecniche sulla toolchain”, se necessario.

Infine, c'è la possibilità che qualche file "include" dal sistema host abbia trovato la strada per inserirsi nella directory "include" privata di GCC. Questo può succedere a causa del processo “fixincludes” di GCC, che funziona come parte di GCC. Daremo ulteriori spiegazioni su questo più avanti in questo capitolo. Per ora, avviate il seguente comando per eliminare questa possibilità:

rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}
[Caution]

Attenzione

È obbligatorio a questo punto fermarsi ed assicurarsi che le funzioni di base (link e compilazione) della nuova toolchain funzionino come previsto. Per questa ragione ora avvieremo un semplice test di integrità:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

Se tutto funziona correttamente, non devono esserci errori, e l'output dell'ultimo comando sarà (tenendo conto di eventuali differenze nel nome del linker dinamico):

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

Notate in particolare che /tools/lib compare come prefisso del nostro linker dinamico.

Se non avete ottenuto l'output come mostrato sopra, o non avete ottenuto nessun output, allora c'è qualcosa di sbagliato. Dovrete investigare e ripercorrere i vostri passi per trovare il problema e correggerlo. Non è possibile continuare fino a quando non è tutto a posto. Per prima cosa, riavviate il test di integrità usando gcc invece di cc. Se questo funziona significa che manca il link simbolico /tools/bin/cc. Rivedete la sezione chiamata “GCC-3.3.3 - Passo 1” e fissate il link simbolico. Secondo, assicuratevi che il PATH sia corretto. Potete verificarlo avviando echo $PATH e verificando che /tools/bin sia all'inizio della lista. Se il PATH è sbagliato può significare che non siete entrati nel sistema come utente lfs o che qualcosa è andato storto nella sezione chiamata “Impostazione dell'ambiente”. Terzo, qualcosa può essere andato male con le modifiche al file di configurazione. In questo caso rimodificate il file di configurazione controllando di eseguire correttamente il taglia-incolla.

Quando sarete sicuri che tutto è a posto, pulite i file dei test:

rm dummy.c a.out