6.10. Riaggiustamento della Toolchain

Ora che le librerie C finali sono state installate, è tempo di aggiustare di nuovo la toolchain. La toolchain verrà messa a punto in modo che ogni nuovo programma compilato si collegherà a queste nuove librerie. Questo è lo stesso processo usato nella fase «Messa a punto» all'inizio del Capitolo 5, ma con le sistemazioni invertite. Nel Capitolo 5 la chain è stata guidata dalle directory /{,usr/}lib dell'host alla nuova directory /tools/lib. Ora la chain verrà guidata dalla stessa directory /tools/lib alle directory di LFS /{,usr/}lib.

Per prima cosa eseguire un backup del linker /tools e sostituirlo con il linker aggiustato che abbiamo creato nel capitolo 5. Creeremo anche un link ai suoi equivalenti in /tools/$(gcc -dumpmachine)/bin.

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

Poi correggere il file specs di GCC in modo che punti al nuovo linker dinamico e così GCC sappia dove trovare il suoi file di avvio. Un comando perl si occupa di questo:

gcc -dumpspecs | \
perl -p -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g;' \
    -e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' > \
    `dirname $(gcc --print-libgcc-file-name)`/specs

È una buona idea controllare visivamente il file specs per verificare che i cambiamenti voluti siano stati apportati.

[Importante]

Importante

Se si sta lavorando su una piattaforma in cui il nome del linker dinamico è diverso da ld-linux.so.2, nel comando precedente sostituire «ld-linux.so.2» con il nome del linker dinamico della piattaforma. Se necessario si rimanda a Sezione 5.2, «Note tecniche sulla Toolchain,».

È obbligatorio a questo punto assicurarsi che le funzioni di base (di compilazione e di link) della toolchain modificata funzionino come previsto. Per farlo, eseguire i seguenti controlli di integrità:

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]

Notare che /lib è ora il prefisso del nostro linker dinamico.

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/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/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("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/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