Eski gcc sürümlerini nasıl oluşturuyorsunuz? Crti.o ile ilgili hatalar bulunamadı


10

Ubuntu 11.10 üzerinde nasıl eski bir gcc (özellikle 4.5.2) oluşturabilir ve "/ usr / bin / ld: crti.o bulamıyorum: Böyle bir dosya veya dizin yok" ile ilgili hataları nasıl önleyebilirim?

Biraz kazma yaptım ve birkaç benzer öğe buldum, ancak sorunumu gerçekten çözmeyen hiçbiri:

  • Tüm sorularımın (libc6-dev ve benzeri) bu soru başına yeniden yüklendiğini doğruladım
  • Crti.o dosyasının / usr / lib32 ve / usr / lib / x86_64-linux-gnu'da bulunduğunu ve ld.so.conf dosyamın bu dizinlere bakmak üzere yapılandırıldığını doğruladım
  • LIBRARY_PATH = / usr / lib / x86_64-linux-gnu ile yaptığım invokasyonumu tamamlamanın işe yaradığını doğruladım, ancak bundan kaçınmak istiyorum (makefiles'ta bir ayrılma noktası haline geliyor)
  • Ben --with-build-sysroot ile çeşitli şeyler denedim, ama başarı ile (oku: belki sadece ayarlamak için doğru bayrağı bilmiyorum)
  • Strace ile çalışırken ( bu cevaba göre ), crti.o'ya çıplak referansı görebilirim:

    13240 açık ("crti.o", O_RDONLY) = -1 ENOENT (Böyle bir dosya veya dizin yok)

Teşekkürler!

Yanıtlar:


7

Ben de aynı problemi yaşadım. Benim için sorunu çözmek için sembolik bağlantılar /usr/libs/crt?.o kurmak /usr/lib/x86_64-linux-gnu/crt?.o.


Bu işe yarıyor, evet. Yine de, altta yatan dosya yapıları ile mucking yerine gcc kurulumunu tweaking hatları boyunca bir çözüm umuyordum ...
Matt

Benim durumumda, glibc ve GCC'yi yeniden derledim, ancak / usr / bin / adresindeki eski bir slackware-gcc varyantından kurtulmayı unuttum. İkincisini çıkardığımda, bazı şeyleri tekrar derleyebilirim (tekrar gcc gibi).
shevy

10

GCC'nin çok yeni sürümleri bile bu mesajda başarısız oluyor. Çünkü yeni Debian / Ubuntu sürümleri çoklu diziyi destekleyecek (tek bir dosya sistemine birden çok makine için ikili dosyalar yükleme) destekleyecektir, böylece kütüphaneler standart yerlerden uzaklaştırılmıştır.

Burada düzeltmek için GCC yamaları var (henüz onaylanmış son sürümler değil, Ubuntu için doğrudur) ve muhtemelen daha fazla çaba harcamadan eski GCC için geçerlidir. GCC'yi --enable-multiarch veya başka bir şeyle yapılandırmanız gerektiğini düşünüyorum .

Bu arada, yumuşak bağlantılar oluşturmak iyi bir çözümdür:

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

(klasör adı 32 bit kurulumlarda farklı olacaktır).

Umarım yardımcı olur.


Çok amaçlı olduğu için teşekkürler. "Neden" çalışmamaya karar vermeyi umuyordum.
Matt

2

Bu sorunu sizin için yararlı olabilecek birkaç geçici çözümle çözdüm.

İlk olarak, GCC'yi derleyin LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, böylece bootstrap oluşturma işlemi crt?.obaşlangıç ​​dosyalarını nerede bulacağını bilir .

Daha sonra, tüm sisteminizi etkilediği yerlerde crt?.osembolik bağlantılar yapmak yerine, /usr/libbu üç dosyayı yürütülebilir dosyanın yüklü olduğu ${prefix}/lib/gcc/...dizine karşılık gelen ${prefix}/bindizine gccbağlayabilirsiniz. Bu aslında başlangıç ​​dosyaları için arama yolunun neredeyse üstündedir. onları bulacak - ama başka hiçbir şeyi etkilemiyorlar.

Benim durumumda, onları koymak için belirli bir dizin vardı lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; doğru olanı bulabilirsiniz çünkü içinde zaten başka dosyalar crtbegin.ovar.


1

Ubuntu hassas x86_64 üzerine GCC 4.1.2'yi oluşturdum. Sizin yaptığınız gibi 32bit c runtime, grep-ped / 32 / için arama yapan son komut "xgcc" nin sıkıntısına bir göz attım. C çalışma zamanı, libc6-dev-i386 paketi tarafından sağlanan / usr / lib32 dizinindedir.

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)

Bu yüzden, xgcc aradığı dizinde crt? .O sembollerini oluşturdum.

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 

Onunla GCC 4.1.2'yi başarıyla inşa ettim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.