OnWorks Linux ແລະ Windows Online WorkStations

Logo

ໂຮດຕິ້ງອອນໄລນ໌ຟຣີສໍາລັບ WorkStations

<Previous | ເນື້ອໃນ | ຕໍ່ໄປ>

6.10. ການ​ປັບ Toolchain ໄດ້​

ໃນປັດຈຸບັນທີ່ຫ້ອງສະຫມຸດ C ສຸດທ້າຍໄດ້ຖືກຕິດຕັ້ງແລ້ວ, ມັນແມ່ນເວລາທີ່ຈະປັບລະບົບຕ່ອງໂສ້ເຄື່ອງມືເພື່ອໃຫ້ມັນເຊື່ອມໂຍງໂປຼແກຼມທີ່ລວບລວມໃຫມ່ກັບຫ້ອງສະຫມຸດໃຫມ່ເຫຼົ່ານີ້.

ຮູບພາບເລັກນ້ອຍ

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

ກ່ອນອື່ນ ໝົດ, ສຳ ຮອງຂໍ້ມູນ / ເຄື່ອງ​ມື​ linker, ແລະທົດແທນມັນດ້ວຍ linker ປັບທີ່ພວກເຮົາເຮັດໃນບົດທີ 5. ພວກເຮົາຍັງຈະສ້າງການເຊື່ອມຕໍ່ກັບຄູ່ຮ່ວມງານຂອງຕົນໃນ. /tools/$(unname -m)-pc-linux-gnu/bin:


mv ມ

ln

-v

-v

-v

mv ມ

ln

-sv /tools/bin/ld /tools/$(unname -m)-pc-linux-gnu/bin/ld

-sv /tools/bin/ld /tools/$(unname -m)-pc-linux-gnu/bin/ld

ຕໍ່ໄປ, ແກ້ໄຂໄຟລ໌ specs GCC ເພື່ອໃຫ້ມັນຊີ້ໃຫ້ເຫັນເຖິງຕົວເຊື່ອມຕໍ່ແບບເຄື່ອນໄຫວໃຫມ່. ພຽງແຕ່ການລຶບຕົວຢ່າງທັງຫມົດຂອງ "/ ເຄື່ອງມື" ຄວນປ່ອຍໃຫ້ພວກເຮົາມີເສັ້ນທາງທີ່ຖືກຕ້ອງກັບຕົວເຊື່ອມຕໍ່ແບບເຄື່ອນໄຫວ. ນອກຈາກນັ້ນ, ປັບໄຟລ໌ specs ເພື່ອໃຫ້ GCC ຮູ້ບ່ອນທີ່ຈະຊອກຫາ headers ທີ່ຖືກຕ້ອງແລະ Glibc start files. ກ sed ຄໍາສັ່ງສໍາເລັດນີ້:


gcc -dumpspec | 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 -dumpspec | 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


ມັນເປັນຄວາມຄິດທີ່ດີທີ່ຈະກວດສອບໄຟລ໌ specs ໂດຍສາຍຕາເພື່ອກວດສອບການປ່ຽນແປງທີ່ມີຈຸດປະສົງຕົວຈິງ.

ມັນເປັນສິ່ງ ຈຳ ເປັນໃນຈຸດນີ້ເພື່ອຮັບປະກັນວ່າ ໜ້າ ທີ່ພື້ນຖານ (ການລວບລວມແລະການເຊື່ອມໂຍງ) ຂອງຕ່ອງໂສ້ເຄື່ອງມືທີ່ຖືກປັບແມ່ນເຮັດວຽກຕາມທີ່ຄາດໄວ້. ເພື່ອເຮັດສິ່ງນີ້, ດໍາເນີນການກວດກາສຸຂະພາບດັ່ງຕໍ່ໄປນີ້:


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'


ບໍ່ຄວນມີຂໍ້ຜິດພາດ, ແລະຜົນຜະລິດຂອງຄໍາສັ່ງສຸດທ້າຍຈະເປັນ (ອະນຸຍາດໃຫ້ມີຄວາມແຕກຕ່າງສະເພາະເວທີໃນຊື່ຕົວເຊື່ອມຕໍ່ແບບເຄື່ອນໄຫວ):


[ຮ້ອງຂໍນາຍພາສາໂປຣແກຣມ: /lib64/ld-linux-x86-64.so.2]

[ຮ້ອງຂໍນາຍພາສາໂປຣແກຣມ: /lib64/ld-linux-x86-64.so.2]


ຮູບພາບເລັກນ້ອຍ

ໃຫ້ສັງເກດວ່າໃນລະບົບ 64-bit / lib ແມ່ນສະຖານທີ່ຂອງຕົວເຊື່ອມຕໍ່ແບບເຄື່ອນໄຫວຂອງພວກເຮົາ, ແຕ່ຖືກເຂົ້າເຖິງໂດຍຜ່ານການເຊື່ອມຕໍ່ສັນຍາລັກໃນ /lib64.


ຫມາຍ​ເຫດ​

ໃນລະບົບ 32-bit ນາຍພາສາຄວນຈະເປັນ /lib/ld-linux.so.2.

ຫມາຍ​ເຫດ​

ໃນລະບົບ 32-bit ນາຍພາສາຄວນຈະເປັນ /lib/ld-linux.so.2.

ຕອນນີ້ໃຫ້ແນ່ໃຈວ່າພວກເຮົາຕັ້ງຄ່າເພື່ອໃຊ້ໄຟລ໌ເລີ່ມຕົ້ນທີ່ຖືກຕ້ອງ:


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

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


ຜົນໄດ້ຮັບຂອງຄໍາສັ່ງສຸດທ້າຍຄວນຈະເປັນ:


/usr/lib/../lib/crt1.o ສຳເລັດແລ້ວ

/usr/lib/../lib/crti.o ສຳເລັດແລ້ວ

/usr/lib/../lib/crtn.o ສຳເລັດແລ້ວ

/usr/lib/../lib/crt1.o ສຳເລັດແລ້ວ

/usr/lib/../lib/crti.o ສຳເລັດແລ້ວ

/usr/lib/../lib/crtn.o ສຳເລັດແລ້ວ


ກວດ​ສອບ​ວ່າ​ຜູ້​ສັງ​ລວມ​ກໍາ​ລັງ​ຊອກ​ຫາ​ສໍາ​ລັບ​ໄຟລ​໌ header ທີ່​ຖືກ​ຕ້ອງ​:


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

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

ຄໍາສັ່ງນີ້ຄວນສົ່ງຄືນຜົນໄດ້ຮັບຕໍ່ໄປນີ້:


#include <...> ການຄົ້ນຫາເລີ່ມຕົ້ນທີ່ນີ້:

/ usr / ປະກອບມີ

#include <...> ການຄົ້ນຫາເລີ່ມຕົ້ນທີ່ນີ້:

/ usr / ປະກອບມີ

ຕໍ່ໄປ, ກວດເບິ່ງວ່າຕົວເຊື່ອມຕໍ່ໃຫມ່ຖືກນໍາໃຊ້ກັບເສັ້ນທາງຄົ້ນຫາທີ່ຖືກຕ້ອງ:


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

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

ການອ້າງອີງເຖິງເສັ້ນທາງທີ່ມີອົງປະກອບທີ່ມີ '-linux-gnu' ຄວນຖືກລະເລີຍ, ແຕ່ຖ້າບໍ່ດັ່ງນັ້ນຜົນໄດ້ຮັບຂອງຄໍາສັ່ງສຸດທ້າຍຄວນຈະເປັນ:


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

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

ຕໍ່ໄປໃຫ້ແນ່ໃຈວ່າພວກເຮົາກໍາລັງໃຊ້ libc ທີ່ຖືກຕ້ອງ:


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

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

ຜົນໄດ້ຮັບຂອງຄໍາສັ່ງສຸດທ້າຍຄວນຈະເປັນ:


ພະຍາຍາມເປີດ /lib/libc.so.6 ສໍາເລັດ

ພະຍາຍາມເປີດ /lib/libc.so.6 ສໍາເລັດ

ສຸດທ້າຍ, ໃຫ້ແນ່ໃຈວ່າ GCC ກໍາລັງໃຊ້ຕົວເຊື່ອມຕໍ່ແບບເຄື່ອນໄຫວທີ່ຖືກຕ້ອງ:


grep ພົບ dummy.log

grep ພົບ dummy.log

ຜົນໄດ້ຮັບຂອງຄໍາສັ່ງສຸດທ້າຍຄວນຈະເປັນ (ອະນຸຍາດໃຫ້ມີຄວາມແຕກຕ່າງສະເພາະເວທີໃນຊື່ຕົວເຊື່ອມຕໍ່ແບບເຄື່ອນໄຫວ):


ພົບ ld-linux-x86-64.so.2 ຢູ່ /lib/ld-linux-x86-64.so.2

ພົບ ld-linux-x86-64.so.2 ຢູ່ /lib/ld-linux-x86-64.so.2

ຖ້າຜົນຜະລິດບໍ່ປາກົດດັ່ງທີ່ສະແດງຢູ່ຂ້າງເທິງຫຼືບໍ່ໄດ້ຮັບທັງຫມົດ, ຫຼັງຈາກນັ້ນບາງສິ່ງບາງຢ່າງແມ່ນຜິດພາດຢ່າງຮ້າຍແຮງ. ສືບ​ສວນ​ແລະ retrace ຂັ້ນ​ຕອນ​ເພື່ອ​ຊອກ​ຫາ​ບ່ອນ​ທີ່​ບັນ​ຫາ​ແມ່ນ​ແລະ​ແກ້​ໄຂ​ມັນ​. ເຫດຜົນຫຼາຍທີ່ສຸດແມ່ນວ່າມີບາງຢ່າງຜິດພາດກັບການປັບໄຟລ໌ specs. ບັນຫາໃດໆຈະຕ້ອງໄດ້ແກ້ໄຂກ່ອນທີ່ຈະສືບຕໍ່ຂະບວນການ.

ເມື່ອທຸກສິ່ງທຸກຢ່າງເຮັດວຽກຢ່າງຖືກຕ້ອງ, ເຮັດຄວາມສະອາດໄຟລ໌ທົດສອບ:


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

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


OS Cloud Computing ຍອດນິຍົມຢູ່ OnWorks: