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!
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:
(nazwa folderu będzie inna w instalacjach 32-bitowych).
Mam nadzieję, że to pomaga.
źródło
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?.o
pliki startowe.Następnie zamiast tworzyć
crt?.o
dowiązania symboliczne w/usr/lib
miejscu, 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}/bin
katalogowi, w którymgcc
jest 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 plikicrtbegin.o
.źródło
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.
Więc stworzyłem dowiązania symboliczne crt? .O w katalogu, którego szukał xgcc.
Z powodzeniem zbudowałem z nim GCC 4.1.2.
źródło