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