<ก่อนหน้านี้ | Contents | ถัดไป>
5.10.1. การติดตั้ง GCC
GCC รุ่นแรกของเราได้ติดตั้งส่วนหัวของระบบภายในสองสามรายการ โดยปกติหนึ่งในนั้น จำกัด.hในทางกลับกันจะรวมถึงระบบที่เกี่ยวข้อง จำกัด.h ส่วนหัวในกรณีนี้ /tools/include/limits.h. อย่างไรก็ตาม ในช่วงเวลาของการสร้างครั้งแรกของ gcc /tools/include/limits.h ไม่มีอยู่ ดังนั้นส่วนหัวภายในที่ติดตั้ง GCC จึงเป็นไฟล์บางส่วนที่มีในตัวเอง และไม่มีคุณลักษณะเพิ่มเติมของส่วนหัวของระบบ สิ่งนี้เพียงพอสำหรับการสร้าง libc ชั่วคราว แต่บิวด์ของ GCC นี้ต้องการส่วนหัวภายในแบบเต็ม สร้างเวอร์ชันเต็มของส่วนหัวภายในโดยใช้คำสั่งที่เหมือนกับที่ระบบบิลด์ GCC ทำในสถานการณ์ปกติ:
แมว gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-ชื่อไฟล์)`/include-fixed/limits.h
แมว gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-ชื่อไฟล์)`/include-fixed/limits.h
ใน gcc/config/{linux,i386/linux{,64}}.h
ใน gcc/config/{linux,i386/linux{,64}}.h
$file{,.orig} 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
's@/usr@/tools@g' $file.orig > $file
$file{,.orig} 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
's@/usr@/tools@g' $file.orig > $file
อีกครั้ง เปลี่ยนตำแหน่งของตัวเชื่อมโยงแบบไดนามิกเริ่มต้นของ GCC เพื่อใช้ตำแหน่งที่ติดตั้งใน /เครื่องมือ.
สำหรับไฟล์ do
ซีพี -ยูวี sed -e
-e
สำหรับไฟล์ do
ซีพี -ยูวี sed -e
-e
เสียงสะท้อน '
#undefSTANDARD_STARTFILE_PREFIX_1
#undefSTANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file แตะ $file.orig
ทำ
เสียงสะท้อน '
#undefSTANDARD_STARTFILE_PREFIX_1
#undefSTANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file แตะ $file.orig
ทำ
หากสร้างบน x86_64 ให้เปลี่ยนชื่อไดเร็กทอรีเริ่มต้นสำหรับไลบรารี 64 บิตเป็น "lib":
กรณี $(uname -m) ใน x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
ว่า C
กรณี $(uname -m) ใน x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
ว่า C
เช่นเดียวกับการสร้าง GCC รุ่นแรก มันต้องมีแพ็คเกจ GMP, MPFR และ MPC แกะ tarballs และย้ายไปยังชื่อไดเร็กทอรีที่ต้องการ:
tar -xf ../mpfr-4.0.2.tar.xz mv -v mpfr-4.0.2 mpfr
tar -xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz mv -v mpc-1.1.0 mpc
tar -xf ../mpfr-4.0.2.tar.xz mv -v mpfr-4.0.2 mpfr
tar -xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz mv -v mpc-1.1.0 mpc
สร้างไดเร็กทอรีบิลด์แยกต่างหากอีกครั้ง:
mkdir -v บิลด์ซีดี
mkdir -v บิลด์ซีดี
ก่อนเริ่มสร้าง GCC อย่าลืมยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อมที่แทนที่แฟล็กการปรับให้เหมาะสมเริ่มต้น ตอนนี้เตรียม GCC สำหรับการรวบรวม:
ซีซี=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-รันลิบ \
../กำหนดค่า \
--prefix=/เครื่องมือ \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--เปิดใช้งานภาษา=c,c++ \
--ปิดการใช้งาน-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp
ซีซี=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-รันลิบ \
../กำหนดค่า \
--prefix=/เครื่องมือ \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--เปิดใช้งานภาษา=c,c++ \
--ปิดการใช้งาน-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp
ความหมายของตัวเลือกการกำหนดค่าใหม่:
--เปิดใช้งานภาษา=c,c++
ตัวเลือกนี้ช่วยให้แน่ใจว่าทั้งคอมไพเลอร์ C และ C++ ถูกสร้างขึ้น
--disable-libstdcxx-pch
อย่าสร้างส่วนหัวที่คอมไพล์ล่วงหน้า (PCH) สำหรับ libstdc ++. มันกินเนื้อที่มาก และเราก็ไม่มีประโยชน์อะไร
--disable-bootstrap
สำหรับบิวด์ดั้งเดิมของ GCC ค่าเริ่มต้นคือการสร้าง "bootstrap" นี่ไม่ใช่แค่คอมไพล์ GCC แต่คอมไพล์หลายครั้ง มันใช้โปรแกรมที่คอมไพล์ในรอบแรกเพื่อคอมไพล์ตัวเองเป็นครั้งที่สอง และอีกครั้งเป็นครั้งที่สาม การทำซ้ำครั้งที่สองและครั้งที่สามถูกเปรียบเทียบเพื่อให้แน่ใจว่าสามารถทำซ้ำได้เองอย่างไม่มีที่ติ นี่ก็หมายความว่ามันถูกรวบรวมอย่างถูกต้อง อย่างไรก็ตาม วิธีการบิลด์ LFS ควรจัดเตรียมคอมไพเลอร์ที่เป็นของแข็งโดยไม่จำเป็นต้องบูตสแตรปในแต่ละครั้ง
รวบรวมแพ็คเกจ:
ทำ
ทำ
ติดตั้งแพ็คเกจ:
ให้ติดตั้ง
ให้ติดตั้ง
ขั้นสุดท้าย ให้สร้างลิงก์เชื่อมโยง หลายโปรแกรมและสคริปต์ทำงาน cc แทน gccซึ่งใช้เพื่อให้โปรแกรมเป็นแบบทั่วไป ดังนั้นจึงสามารถใช้ได้กับระบบ UNIX ทุกประเภทที่ไม่ได้ติดตั้งคอมไพเลอร์ GNU C เสมอ วิ่ง cc ทำให้ผู้ดูแลระบบมีอิสระในการตัดสินใจว่าจะติดตั้งคอมไพเลอร์ C ตัวใด:
ln -sv gcc /tools/bin/cc
ln -sv gcc /tools/bin/cc
คำเตือน
ณ จุดนี้ จำเป็นต้องหยุดและตรวจสอบให้แน่ใจว่าฟังก์ชันพื้นฐาน (การคอมไพล์และการเชื่อมโยง) ของ toolchain ใหม่ทำงานตามที่คาดไว้ ในการดำเนินการตรวจสอบสุขภาพจิต ให้รันคำสั่งต่อไปนี้:
echo 'int main(){}' > dummy.c cc dummy.c
readelf -l a.out | grep ': / เครื่องมือ'
echo 'int main(){}' > dummy.c cc dummy.c
readelf -l a.out | grep ': / เครื่องมือ'
หากทุกอย่างทำงานอย่างถูกต้อง จะไม่มีข้อผิดพลาด และผลลัพธ์ของคำสั่งสุดท้ายจะอยู่ในรูปแบบ:
[กำลังขอโปรแกรมล่าม: /tools/lib64/ld-linux-x86-64.so.2]
[กำลังขอโปรแกรมล่าม: /tools/lib64/ld-linux-x86-64.so.2]
โปรดทราบว่าตัวเชื่อมโยงแบบไดนามิกจะเป็น /tools/lib/ld-linux.so.2 สำหรับเครื่อง 32 บิต
หากเอาต์พุตไม่แสดงดังด้านบนหรือไม่มีเอาต์พุตเลย แสดงว่ามีบางอย่างผิดปกติ ตรวจสอบและย้อนขั้นตอนเพื่อดูว่าปัญหาอยู่ที่ไหนและแก้ไขให้ถูกต้อง ปัญหานี้ต้องได้รับการแก้ไขก่อนดำเนินการต่อ ขั้นแรก ให้ดำเนินการตรวจสุขภาพจิตอีกครั้งโดยใช้ gcc แทน cc. ถ้าสิ่งนี้ได้ผล แสดงว่า /เครื่องมือ/ถัง/ cc ลิงก์สัญลักษณ์หายไป ติดตั้ง symlink ตามด้านบน ต่อไป ตรวจสอบให้แน่ใจว่า เส้นทาง ถูกต้อง. สามารถตรวจสอบได้ด้วยการรัน เสียงสะท้อน $PATH และยืนยันว่า /เครื่องมือ/ถัง อยู่ที่หัวของรายการ ถ้า เส้นทาง ไม่ถูกต้อง อาจหมายความว่าคุณไม่ได้เข้าสู่ระบบในฐานะผู้ใช้ เอลฟ์ หรือมีบางอย่างผิดพลาดกลับมาในข้อ 4.4 “การสร้างสิ่งแวดล้อม”
เมื่อเรียบร้อยแล้ว ให้ล้างไฟล์ทดสอบ:
rm -v dummy.c a.out
rm -v dummy.c a.out