Workstation online OnWorks Linux e Windows

Logo

Hosting online gratuito per workstation

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

Immagine

/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]


Immagine

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


Il miglior sistema operativo cloud computing su OnWorks: