Jak budujesz starsze wersje gcc? Nie znaleziono błędów związanych z crti.o

10

Jak mogę zbudować starszą wersję gcc (konkretnie 4.5.2) na Ubuntu 11.10 i uniknąć błędów dotyczących „/ usr / bin / ld: nie mogę znaleźć crti.o: brak takiego pliku lub katalogu”?

Wykonałem trochę kopania i znalazłem kilka podobnych elementów, ale żaden nie rozwiązał mojego problemu:

  • Sprawdziłem, czy wszystkie moje pakiety (libc6-dev i podobne) są ponownie instalowane zgodnie z tym pytaniem
  • Sprawdziłem, czy crti.o istnieje w / usr / lib32 i / usr / lib / x86_64-linux-gnu, i że mój plik ld.so.conf jest skonfigurowany do przeglądania tych katalogów
  • Sprawdziłem, że przygotowywanie mojego wywołania make z LIBRARY_PATH = / usr / lib / x86_64-linux-gnu działa, ale chciałbym tego uniknąć (staje się punktem rozbieżnym w plikach makefiles)
  • Próbowałem różnych rzeczy z opcją --with-build-sysroot, ale bezskutecznie (czytaj: może po prostu nie znam odpowiedniej flagi)
  • Podczas pracy ze strace (zgodnie z tą odpowiedzią ) widzę surowe odniesienie do crti.o:

    13240 otwarty („crti.o”, O_RDONLY) = -1 ENOENT (Brak takiego pliku lub katalogu)

Dzięki!

Matt
źródło

Odpowiedzi:

7

Miałem ten sam problem. Dokonywanie dowiązania symboliczne ze /usr/libs/crt?.o aby /usr/lib/x86_64-linux-gnu/crt?.orozwiązać problem dla mnie.

Yoav
źródło
To działa, tak. Miałem nadzieję na rozwiązanie, które byłoby bardziej zgodne z poprawkami instalacji gcc, a nie zrzucaniem bazowych struktur plików, ale ...
Matt
Chciałem dodać, że w moim przypadku skompilowałem glibc i GCC, ale zapomniałem pozbyć się starszego wariantu slackware-gcc, który był w / usr / bin /. Kiedy usunąłem to drugie, mogłem ponownie skompilować pewne rzeczy (takie jak gcc ponownie).
shevy
10

Nawet bardzo nowe wersje GCC zawodzą z tym komunikatem. Jest tak, ponieważ nowe wersje Debian / Ubuntu (będą) obsługiwały wiele ścieżek (tj. Instalowanie plików binarnych dla wielu komputerów w jednym systemie plików), więc biblioteki zostały przeniesione z dala od standardowych miejsc.

Istnieje GCC patche go naprawić tutaj (jeszcze nie zatwierdzony wersje ostateczne, ale poprawna dla Ubuntu), a oni prawdopodobnie stosuje się do starszej GCC bez większego wysiłku, może. Myślę, że musisz skonfigurować GCC z opcją --enable-multiarch lub coś takiego.

Tymczasem tworzenie miękkich linków jest dobrym rozwiązaniem:

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

(nazwa folderu będzie inna w instalacjach 32-bitowych).

Mam nadzieję, że to pomaga.

ams
źródło
Dzięki za informację o tym, że jest to wiele kursów. Miałem nadzieję na rozwiązanie problemu „dlaczego” przestało działać.
Matt
2

Rozwiązałem ten problem za pomocą kilku obejść, które mogą być dla Ciebie przydatne.

Najpierw skompiluj GCC LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, aby proces kompilacji bootstrap wiedział, gdzie znaleźć crt?.opliki startowe.

Następnie zamiast tworzyć crt?.odowiązania symboliczne w /usr/libmiejscu, w którym wpływają one na cały system, możesz dowiązać te trzy pliki do ${prefix}/lib/gcc/...katalogu odpowiadającego ${prefix}/binkatalogowi, w którym gccjest zainstalowany plik wykonywalny. To właściwie prawie na górze ścieżki wyszukiwania plików startowych, więc znajdzie je - ale nie wpływają na nic innego.

W moim przypadku katalogiem, w którym można je umieścić, był lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; możesz znaleźć właściwy, ponieważ zawiera on już inne pliki crtbegin.o.

Brooks Moses
źródło
1

Zbudowałem GCC 4.1.2 na Ubuntu precyzyjnym x86_64. W tym momencie rzuciłem okiem na ostatnią komendę „xgcc”, szukając 32-bitowego środowiska wykonawczego c, grep-ped / 32 / w następujący sposób. Moje środowisko wykonawcze C znajduje się w / usr / lib32, który jest dostarczany przez pakiet 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)

Więc stworzyłem dowiązania symboliczne crt? .O w katalogu, którego szukał 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 

Z powodzeniem zbudowałem z nim GCC 4.1.2.

Naoyuki Tai
źródło