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.
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