<Precedenti | Contenuti | Succ.>
6.10. Regolazione della toolchain
Ora che le librerie C finali sono state installate, è il momento di regolare la toolchain in modo che colleghi qualsiasi programma appena compilato a queste nuove librerie.
/tools/bin/{ld,ld-vecchio}
/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
/tools/bin/{ld-nuovo,ld}
/tools/bin/{ld,ld-vecchio}
/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
/tools/bin/{ld-nuovo,ld}
Per prima cosa, esegui il backup /utensili linker e sostituirlo con il linker modificato che abbiamo creato nel capitolo 5. Creeremo anche un collegamento alla sua controparte in /tools/$(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
Quindi, modifica il file delle specifiche GCC in modo che punti al nuovo linker dinamico. La semplice eliminazione di tutte le istanze di "/tools" dovrebbe lasciarci il percorso corretto per il linker dinamico. Regola anche il file delle specifiche in modo che GCC sappia dove trovare le intestazioni corrette e i file di avvio di Glibc. UN sete comando esegue questo:
gcc -dumpspecs | sed -e 's@/strumenti@@g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
`dirname $(gcc --print-libgcc-nome-file)`/specs
gcc -dumpspecs | sed -e 's@/strumenti@@g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
`dirname $(gcc --print-libgcc-nome-file)`/specs
È una buona idea ispezionare visivamente il file delle specifiche per verificare che la modifica prevista sia stata effettivamente apportata.
È imperativo a questo punto assicurarsi che le funzioni di base (compilazione e collegamento) della toolchain modificata funzionino come previsto. Per fare ciò, 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à (consentendo differenze specifiche della piattaforma nel nome del linker dinamico):
[Richiesta dell'interprete del programma: /lib64/ld-linux-x86-64.so.2]
[Richiesta dell'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 vi si accede tramite un collegamento simbolico in /lib64.
Note:
Sui sistemi a 32 bit l'interprete dovrebbe essere /lib/ld-linux.so.2.
Note:
Sui sistemi a 32 bit l'interprete dovrebbe essere /lib/ld-linux.so.2.
Ora assicurati di essere configurato 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
Verifica 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
Quindi, verifica 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 a percorsi che hanno componenti con '-linux-gnu' dovrebbero essere ignorati, altrimenti l'output dell'ultimo comando dovrebbe essere:
SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib")
Quindi assicurati 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 aprire /lib/libc.so.6 riuscito
tentativo di aprire /lib/libc.so.6 riuscito
Infine, assicurati che GCC stia utilizzando il linker dinamico corretto:
grep trovato dummy.log
grep trovato dummy.log
L'output dell'ultimo comando dovrebbe essere (consentendo differenze specifiche della piattaforma nel nome del linker dinamico):
trovato ld-linux-x86-64.so.2 su /lib/ld-linux-x86-64.so.2
trovato ld-linux-x86-64.so.2 su /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. La ragione più probabile è che qualcosa sia andato storto con la regolazione 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 test:
rm -v manichino.c a.out manichino.log
rm -v manichino.c a.out manichino.log