Workstation online OnWorks Linux e Windows

Logo

Hosting online gratuito per workstation

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

Immagine

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


Immagine

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


Il miglior sistema operativo cloud computing su OnWorks: