Stații de lucru online OnWorks Linux și Windows

logo

Găzduire online gratuită pentru stații de lucru

<Înapoi | Cuprins | Următor>

6.10. Reglarea lanțului de instrumente‌

Acum că au fost instalate ultimele biblioteci C, este timpul să ajustați lanțul de instrumente astfel încât să lege orice program nou compilat cu aceste noi biblioteci.

imagine

/tools/bin/{ld,ld-old}

/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}

/tools/bin/{ld-new,ld}

/tools/bin/{ld,ld-old}

/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}

/tools/bin/{ld-new,ld}

Mai întâi, faceți backup pentru /instrumente linker și înlocuiți-l cu linkerul ajustat pe care l-am făcut în capitolul 5. De asemenea, vom crea un link către omologul său în /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

Apoi, modificați fișierul cu specificații GCC, astfel încât să indice noul linker dinamic. Pur și simplu ștergerea tuturor instanțelor „/tools” ar trebui să ne lase cu calea corectă către linkerul dinamic. De asemenea, ajustați fișierul cu specificații, astfel încât GCC să știe unde să găsească anteturile corecte și fișierele de pornire Glibc. A sete comanda realizează acest lucru:


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


Este o idee bună să inspectați vizual fișierul cu specificații pentru a verifica că modificarea intenționată a fost efectiv făcută.

În acest moment, este imperativ să vă asigurați că funcțiile de bază (compilarea și legarea) ale lanțului de instrumente ajustat funcționează conform așteptărilor. Pentru a face acest lucru, efectuați următoarele verificări de sănătate:


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'


Nu ar trebui să existe erori, iar rezultatul ultimei comenzi va fi (permițând diferențe specifice platformei în numele linkerului dinamic):


[Se solicită interpretul de program: /lib64/ld-linux-x86-64.so.2]

[Se solicită interpretul de program: /lib64/ld-linux-x86-64.so.2]


imagine

Rețineți că pe sistemele pe 64 de biți / lib este locația linkerului nostru dinamic, dar este accesat printr-o legătură simbolică în /lib64.


notițe

Pe sistemele pe 32 de biți, interpretul ar trebui să fie /lib/ld-linux.so.2.

notițe

Pe sistemele pe 32 de biți, interpretul ar trebui să fie /lib/ld-linux.so.2.

Acum asigurați-vă că suntem configurați pentru a folosi fișierele de pornire corecte:


grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log


Ieșirea ultimei comenzi ar trebui să fie:


/usr/lib/../lib/crt1.o a reușit

/usr/lib/../lib/crti.o a reușit

/usr/lib/../lib/crtn.o a reușit

/usr/lib/../lib/crt1.o a reușit

/usr/lib/../lib/crti.o a reușit

/usr/lib/../lib/crtn.o a reușit


Verificați dacă compilatorul caută fișierele de antet corecte:


grep -B1 '^ /usr/include' dummy.log

grep -B1 '^ /usr/include' dummy.log

Această comandă ar trebui să returneze următoarea ieșire:


#include <...> căutarea începe aici:

/ usr / include

#include <...> căutarea începe aici:

/ usr / include

Apoi, verificați dacă noul linker este utilizat cu căile de căutare corecte:


grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

Referințele la căile care au componente cu „-linux-gnu” ar trebui ignorate, dar în caz contrar rezultatul ultimei comenzi ar trebui să fie:


SEARCH_DIR("/usr/lib") SEARCH_DIR ("/lib")

SEARCH_DIR("/usr/lib") SEARCH_DIR ("/lib")

Apoi, asigurați-vă că folosim libc-ul corect:


grep "/lib.*/libc.so.6 " dummy.log

grep "/lib.*/libc.so.6 " dummy.log

Ieșirea ultimei comenzi ar trebui să fie:


încercarea de a deschide /lib/libc.so.6 a reușit

încercarea de a deschide /lib/libc.so.6 a reușit

În cele din urmă, asigurați-vă că GCC utilizează linkerul dinamic corect:


grep găsit dummy.log

grep găsit dummy.log

Ieșirea ultimei comenzi ar trebui să fie (permițând diferențe specifice platformei în numele linkerului dinamic):


găsit ld-linux-x86-64.so.2 la /lib/ld-linux-x86-64.so.2

găsit ld-linux-x86-64.so.2 la /lib/ld-linux-x86-64.so.2

Dacă ieșirea nu apare așa cum se arată mai sus sau nu este primită deloc, atunci ceva este în neregulă. Investigați și reveniți pe pașii pentru a afla unde este problema și remediați-o. Motivul cel mai probabil este că ceva nu a mers prost cu ajustarea fișierului cu specificații. Orice problemă va trebui rezolvată înainte de a continua procesul.

După ce totul funcționează corect, curățați fișierele de testare:


rm -v dummy.c a.out dummy.log

rm -v dummy.c a.out dummy.log


Top OS Cloud Computing la OnWorks: