คุณจะสร้างเวอร์ชัน gcc ที่เก่ากว่าได้อย่างไร ข้อผิดพลาดเกี่ยวกับ crti.o ไม่พบ


10

ฉันจะสร้าง gcc รุ่นเก่า (โดยเฉพาะ 4.5.2) บน Ubuntu 11.10 ได้อย่างไรและหลีกเลี่ยงข้อผิดพลาดเกี่ยวกับ "/ usr / bin / ld: ไม่พบ crti.o: ไม่มีไฟล์หรือไดเรกทอรี"

ฉันขุดนิดหน่อยและพบสิ่งที่คล้ายกันหลายอย่าง แต่ไม่มีใครแก้ปัญหาได้จริง:

  • ฉันได้ตรวจสอบแพคเกจทั้งหมดของฉัน (libc6-dev และอื่น ๆ ) ติดตั้งใหม่ตามคำถามนี้
  • ฉันได้ตรวจสอบ crti.o แล้วใน / usr / lib32 และ / usr / lib / x86_64-linux-gnu และ ld.so.conf ของฉันถูกกำหนดค่าให้ค้นหาในไดเรกทอรีเหล่านั้น
  • ฉันได้ตรวจสอบแล้วว่าการทำคำขอร้องให้ทำด้วย LIBRARY_PATH = / usr / lib / x86_64-linux-gnu ทำงานได้ แต่ต้องการหลีกเลี่ยงปัญหานี้ (มันจะกลายเป็นจุดแยกใน makefiles)
  • ฉันได้ลองทำสิ่งต่าง ๆ ด้วย - กับ-build-sysroot แต่ไม่ประสบความสำเร็จ (อ่าน: บางทีฉันอาจไม่รู้ธงที่เหมาะสมที่จะตั้ง)
  • เมื่อทำงานกับ strace (ตามคำตอบนี้ ) ฉันสามารถดูการอ้างอิงเปลือยกับ crti.o:

    13240 open ("crti.o", O_RDONLY) = -1 ENOENT (ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว)

ขอบคุณ!

คำตอบ:


7

ผมมีปัญหาเดียวกัน. การสร้างลิงก์สัญลักษณ์จาก/usr/libs/crt?.o เพื่อ/usr/lib/x86_64-linux-gnu/crt?.oแก้ไขปัญหาให้ฉัน


มันใช้งานได้ใช่ ผมก็หวังว่าสำหรับการแก้ปัญหาที่ได้มากขึ้นตามสายของ tweaking ติดตั้ง GCC มากกว่าสิที่มีพื้นฐานโครงสร้างแฟ้ม แต่ ...
แมตต์

ฉันต้องการที่จะเพิ่มในกรณีของฉันฉันรวบรวม glibc และ GCC ใหม่ แต่ฉันลืมที่จะกำจัดตัวแปร slackware-gcc รุ่นเก่าที่อยู่ที่ / usr / bin / เมื่อฉันลบอันหลังฉันสามารถรวบรวมบางสิ่งได้อีกครั้ง (เช่น gcc อีกครั้ง)
shevy

10

แม้แต่ GCC เวอร์ชันใหม่ที่ล้มเหลวด้วยข้อความนั้น มันเป็นเพราะ Debian / Ubuntu รุ่นใหม่ (จะ) รองรับ multiarch (เช่นการติดตั้งไบนารีสำหรับหลายเครื่องในระบบไฟล์เดียว) ดังนั้นห้องสมุดจึงถูกย้ายออกไปจากสถานที่มาตรฐาน

มี GCC patches เพื่อแก้ไขที่นี่ (ยังไม่ได้รับการอนุมัติรุ่นสุดท้าย, แต่ถูกต้องสำหรับ Ubuntu), และอาจใช้กับ GCC ที่เก่ากว่าโดยไม่มีความพยายาม, อาจจะเป็น. ฉันคิดว่าคุณต้องกำหนดค่า GCC ด้วย--enable-multiarchหรืออะไรบางอย่าง

ในระหว่างนี้การสร้างลิงก์ที่อ่อนนุ่มคือการแก้ไขที่ดี:

cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .

(ชื่อโฟลเดอร์จะแตกต่างกันในการติดตั้งแบบ 32 บิต)

หวังว่าจะช่วย


ขอบคุณสำหรับจุดที่เกี่ยวกับการเป็นมัลติarch ฉันหวังว่าจะได้รับการแก้ไขที่ "ทำไม" มันหยุดทำงาน
Matt

2

ฉันแก้ไขปัญหานี้ด้วยวิธีแก้ไขปัญหาสองสามอย่างที่อาจเป็นประโยชน์สำหรับคุณ

ขั้นแรกให้สร้าง GCC ด้วยLIBRARY_PATH=/usr/lib/x86_64-linux-gnuเพื่อให้กระบวนการสร้าง bootstrap รู้ตำแหน่งที่จะค้นหาcrt?.oไฟล์เริ่มต้น

จากนั้นแทนการcrt?.osymlinks ใน/usr/libที่ที่พวกเขาส่งผลกระทบต่อทั้งระบบของคุณคุณสามารถ symlink ทั้งสามไฟล์ลงใน${prefix}/lib/gcc/...ไดเรกทอรีที่สอดคล้องกับ${prefix}/binไดเรกทอรีว่าgccปฏิบัติการที่ติดตั้งใน. ที่จริงเกือบที่ด้านบนของเส้นทางการค้นหาสำหรับไฟล์เริ่มต้นดังนั้น มันจะพบพวกเขา - แต่พวกเขาจะไม่ส่งผลกระทบอะไรเลย

ในกรณีของฉันไดเรกทอรีเฉพาะที่จะนำพวกเขามาคือlib/gcc/x86_64-unknown-linux-gnu/4.3.2/; คุณสามารถค้นหาไฟล์ที่ต้องการเพราะมันมีไฟล์อื่นcrtbegin.oอยู่ในนั้นอยู่แล้ว


1

ฉันสร้าง GCC 4.1.2 บน Ubuntu ที่แม่นยำ x86_64 อย่างที่คุณทำฉันดูที่ strace ของคำสั่งสุดท้าย "xgcc" ที่กำลังมองหารันไทม์ 32 บิต c, grep-ped / 32 / ดังนี้ C รันไทม์ในของฉันอยู่ใน / usr / lib32 ซึ่งจัดทำโดยแพ็คเกจ libc6-dev-i386

fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)

ดังนั้นฉันจึงสร้าง crt? .o symlink ในไดเรกทอรี xgcc ค้นหา

sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o 
sudo ln -s /usr/lib32/crtn.o 
sudo ln -s /usr/lib32/crti.o 

ฉันสร้าง GCC 4.1.2 สำเร็จแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.