<Precedenti | Contenuti | Succ.>
6.10. Regolazione della toolchain
Ora che sono state installate le librerie C definitive, è il momento di adattare la toolchain in modo che colleghi qualsiasi programma appena compilato a queste nuove librerie.
/strumenti/bin/{ld,ld-vecchio}
/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
/strumenti/bin/{ld-nuovo,ld}
/strumenti/bin/{ld,ld-vecchio}
/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
/strumenti/bin/{ld-nuovo,ld}
Per prima cosa, esegui il backup del /utensili linker e sostituirlo con il linker modificato che abbiamo creato nel capitolo 5. Creeremo anche un collegamento alla sua controparte in /strumenti/$(uname -m)-pc-linux-gnu/bin:
mv mv mv
ln
-v
-v
-v
mv mv mv
ln
-sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld
-sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld
Successivamente, modifica il file delle specifiche di GCC in modo che punti al nuovo linker dinamico. La semplice eliminazione di tutte le istanze di "/tools" dovrebbe lasciare il percorso corretto per il linker dinamico. Modifica anche il file delle specifiche in modo che GCC sappia dove trovare gli header e i file di avvio di Glibc corretti. sete il comando realizza questo:
gcc -dumpspecs | sed -e 's@/tools@@g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
`dirname $(gcc --print-libgcc-file-name)`/specs
gcc -dumpspecs | sed -e 's@/tools@@g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
`dirname $(gcc --print-libgcc-file-name)`/specs
È una buona idea ispezionare visivamente il file delle specifiche per verificare che la modifica prevista sia stata effettivamente apportata.
A questo punto è fondamentale assicurarsi che le funzioni di base (compilazione e collegamento) della toolchain modificata funzionino come previsto. Per farlo, eseguire i seguenti controlli di integrità:
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Non dovrebbero esserci errori e l'output dell'ultimo comando sarà (tenendo conto delle differenze specifiche della piattaforma nel nome del linker dinamico):
[Richiedente interprete del programma: /lib64/ld-linux-x86-64.so.2]
[Richiedente interprete del programma: /lib64/ld-linux-x86-64.so.2]
Nota che sui sistemi a 64 bit / lib è la posizione del nostro linker dinamico, ma è accessibile tramite un collegamento simbolico in /lib64.
Note:
Nei sistemi a 32 bit l'interprete dovrebbe essere /lib/ld-linux.so.2.
Note:
Nei sistemi a 32 bit l'interprete dovrebbe essere /lib/ld-linux.so.2.
Ora assicuriamoci di essere configurati per utilizzare i file di avvio corretti:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
L'output dell'ultimo comando dovrebbe essere:
/usr/lib/../lib/crt1.o riuscito
/usr/lib/../lib/crti.o riuscito
/usr/lib/../lib/crtn.o riuscito
/usr/lib/../lib/crt1.o riuscito
/usr/lib/../lib/crti.o riuscito
/usr/lib/../lib/crtn.o riuscito
Verificare che il compilatore stia cercando i file di intestazione corretti:
grep -B1 '^ /usr/include' dummy.log
grep -B1 '^ /usr/include' dummy.log
Questo comando dovrebbe restituire il seguente output:
#include <...> la ricerca inizia qui:
/ usr / include
#include <...> la ricerca inizia qui:
/ usr / include
Successivamente, verificare che il nuovo linker venga utilizzato con i percorsi di ricerca corretti:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
I riferimenti ai percorsi che hanno componenti con '-linux-gnu' dovrebbero essere ignorati, altrimenti l'output dell'ultimo comando dovrebbe essere:
RICERCA_DIR("/usr/lib") RICERCA_DIR("/lib")
RICERCA_DIR("/usr/lib") RICERCA_DIR("/lib")
Ora assicuriamoci di utilizzare la libc corretta:
grep "/lib.*/libc.so.6 " dummy.log
grep "/lib.*/libc.so.6 " dummy.log
L'output dell'ultimo comando dovrebbe essere:
tentativo di apertura di /lib/libc.so.6 riuscito
tentativo di apertura di /lib/libc.so.6 riuscito
Infine, assicurati che GCC utilizzi il linker dinamico corretto:
grep ha trovato dummy.log
grep ha trovato dummy.log
L'output dell'ultimo comando dovrebbe essere (tenendo conto delle differenze specifiche della piattaforma nel nome del linker dinamico):
trovato ld-linux-x86-64.so.2 in /lib/ld-linux-x86-64.so.2
trovato ld-linux-x86-64.so.2 in /lib/ld-linux-x86-64.so.2
Se l'output non appare come mostrato sopra o non viene ricevuto affatto, allora c'è qualcosa di gravemente sbagliato. Indagare e ripercorrere i passaggi per scoprire dove si trova il problema e correggerlo. Il motivo più probabile è che qualcosa sia andato storto con la modifica del file delle specifiche. Eventuali problemi dovranno essere risolti prima di continuare con il processo.
Una volta che tutto funziona correttamente, ripulisci i file di prova:
rm -v dummy.c a.out dummy.log
rm -v dummy.c a.out dummy.log