Bagaimana Anda membuat versi gcc yang lebih lama? Kesalahan tentang crti.o tidak ditemukan

10

Bagaimana saya bisa membangun gcc yang lebih lama (khususnya, 4.5.2) di Ubuntu 11.10 dan menghindari kesalahan tentang "/ usr / bin / ld: tidak dapat menemukan crti.o: Tidak ada file atau direktori"?

Saya telah melakukan sedikit penggalian dan menemukan beberapa item serupa, tetapi tidak ada yang benar-benar menyelesaikan masalah saya:

  • Saya telah memverifikasi semua paket saya (libc6-dev dan sejenisnya) diinstal ulang per pertanyaan ini
  • Saya telah memverifikasi crti.o ada di / usr / lib32 dan / usr / lib / x86_64-linux-gnu, dan bahwa ld.so.conf saya dikonfigurasi untuk mencari di direktori tersebut
  • Saya telah memverifikasi bahwa menambahkan permintaan make saya dengan LIBRARY_PATH = / usr / lib / x86_64-linux-gnu berfungsi, tetapi ingin menghindari ini (ini menjadi titik divergen dalam makefiles)
  • Saya sudah mencoba berbagai hal dengan --with-build-sysroot, tetapi tidak berhasil (baca: mungkin saya tidak tahu flag yang tepat untuk diatur)
  • Saat menjalankan dengan strace (sesuai jawaban ini ), saya bisa melihat referensi telanjang ke crti.o:

    13240 terbuka ("crti.o", O_RDONLY) = -1 ENOENT (Tidak ada file atau direktori seperti itu)

Terima kasih!

Mat
sumber

Jawaban:

7

Saya memiliki masalah yang sama. Membuat tautan simbolis dari /usr/libs/crt?.o untuk /usr/lib/x86_64-linux-gnu/crt?.omenyelesaikan masalah bagi saya.

Yoav
sumber
Ini berhasil, ya. Saya berharap untuk solusi yang lebih sesuai dengan tweaking instalasi gcc daripada mucking dengan struktur file yang mendasarinya, meskipun ...
Matt
Saya ingin menambahkan bahwa dalam kasus saya, saya mengkompilasi ulang glibc dan GCC, tetapi saya lupa untuk menyingkirkan varian slackware-gcc yang lebih lama yang ada di / usr / bin /. Ketika saya menghapus yang terakhir, saya bisa mengkompilasi hal-hal tertentu lagi (seperti gcc lagi).
shevy
10

Bahkan versi baru GCC gagal dengan pesan itu. Itu karena rilis Debian / Ubuntu yang baru (akan) mendukung multiarch (yaitu menginstal binari untuk beberapa mesin dalam satu sistem file), sehingga perpustakaan telah dipindahkan dari tempat-tempat standar.

Ada tambalan GCC untuk memperbaikinya di sini (belum final versi yang disetujui, tetapi benar untuk Ubuntu), dan mereka mungkin berlaku untuk GCC yang lebih tua tanpa banyak usaha, mungkin. Saya pikir Anda perlu mengkonfigurasi GCC dengan --enable-multiarch , atau sesuatu.

Sementara itu, membuat tautan lunak adalah perbaikan yang bagus:

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

(nama folder akan berbeda pada instalasi 32-bit).

Semoga itu bisa membantu.

am
sumber
Terima kasih atas poinnya tentang hal ini menjadi multiarch. Saya berharap resolusi tentang "mengapa" itu berhenti bekerja.
Matt
2

Saya memecahkan masalah ini dengan beberapa solusi yang mungkin berguna bagi Anda.

Pertama, buat GCC dengan LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, sehingga proses membangun bootstrap tahu di mana menemukan crt?.ofile mulai.

Kemudian, alih-alih membuat crt?.osymlink di /usr/libmana mereka mempengaruhi seluruh sistem Anda, Anda dapat symlink ketiga file ke ${prefix}/lib/gcc/...direktori yang sesuai dengan ${prefix}/bindirektori tempat gccexecutable diinstal. Itu sebenarnya hampir di bagian atas jalur pencarian untuk file mulai, jadi itu akan menemukan mereka - tetapi mereka tidak mempengaruhi hal lain.

Dalam kasus saya, direktori khusus untuk meletakkannya adalah lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; Anda dapat menemukan yang tepat karena sudah memiliki file lain seperti crtbegin.odi dalamnya.

Brooks Moses
sumber
1

Saya membangun GCC 4.1.2 di x86_64 tepat Ubuntu. Seperti yang Anda lakukan, saya melihat strace dari perintah terakhir "xgcc" mencari runtime c 32bit, grep-ped / 32 / sebagai berikut. C runtime di tambang ada di / usr / lib32 yang disediakan oleh paket 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)

Jadi, saya membuat crt? .O mencari symlink di direktori 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 

Saya berhasil membangun GCC 4.1.2 dengan itu.

Naoyuki Tai
sumber