6.10. Justere verktøykjeden

Nå som de endelige C bibliotekene er installert, er det på tide å justere verktøykjeden slik at den kobler alle nylig kompilerte programmer mot disse nye bibliotekene.

Først sikkerhetskopierer du /tools linker, og erstatter den med den justerte linkeren vi lagde i kapittel 5. Vi oppretter også en kobling til motparten i /tools/$(uname -m) -pc-linux-gnu / bin:

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

Deretter endrer du GCC spesifikasjonsfilen slik at den peker til den nye dynamiske linkeren. Slett alle forekomster av “/tools” bør gi oss den rette veien til den dynamiske linkeren. Juster også spesifikasjonsfilen slik at GCC vet hvor du finner riktige deklarasjoner og Glibc startfiler. En sed kommando oppnår dette:

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

Det er en god ide å inspisere spesifikasjonsfilen visuelt for å bekrefte at den tiltenkte endringen faktisk ble gjort.

Det er viktig på dette tidspunktet å sikre at de grunnleggende funksjonene (sammenstilling og kobling) av den justerte verktøykjeden fungerer som forventet. For å gjøre dette, utfør følgende tilregnelighetskontroller:

echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

Det skal ikke være noen feil, og utdataene fra den siste kommandoen vil være (gir mulighet for plattformspesifikke forskjeller i dynamisk linkernavn):

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Legg merke til at på 64-biters systemer er /lib plasseringen til vår dynamiske linker, men nås via en symbolsk kobling i /lib64.

På 32-biters systemer skal tolken være /lib/ld-linux.so.2.

Forsikre deg nå om at vi er klar til å bruke riktige startfiler:

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

Utdataen til den siste kommandoen skal være:

/usr/lib/../lib/crt1.o succeeded
/usr/lib/../lib/crti.o succeeded
/usr/lib/../lib/crtn.o succeeded

Kontroller at kompilatoren søker etter riktige deklarasjonsfiler:

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

Denne kommandoen skal returnere følgende utdata:

#include <...> search starts here:
/usr/include

Deretter må du bekrefte at den nye linkeren brukes med de riktige søkeveiene:

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

Henvisninger til stier som har komponenter med 'linux-gnu', bør ignoreres, men ellers skal utgangen fra den siste kommandoen være:

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

Neste sjekk at vi bruker riktig libc:

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

Utdataen til den siste kommandoen skal være:

attempt to open /lib/libc.so.6 succeeded

Til slutt, sørg for at GCC bruker riktig dynamisk linker:

grep found dummy.log

Utgangen fra den siste kommandoen skal være (gir mulighet for plattformspesifikke forskjeller i dynamisk linkernavn):

found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2

Hvis utdataen ikke vises som vist ovenfor eller ikke mottas i det hele tatt, er noe alvorlig galt. Undersøk og følg trinnene for å finne ut hvor problemet er og rette det. Den mest sannsynlige årsaken er at noe gikk galt med specs filjustering. Eventuelle problemer må løses før du fortsetter med prosessen.

Når alt fungerer riktig, kan du rense opp testfilene:

rm -v dummy.c a.out dummy.log
Forrige Hjem Neste