[+] od czego zacząć kompilację skrośną?
: 25 listopada 2008, 15:03
Zależy mi na zbudowaniu Linuksa dla jornady 680 (procesor sh7709a). Skądinąd wiem, że metoda to sh3. Potrzebne mi jądro, ale do kompilacji potrzebuję odpowiedniej wersji gcc i g++, więc na samym dole łańcucha troficznego jest binutils. Problem polega na tym, że jakich opcji nie podałbym przy konfiguracji, po zapytaniu
dostaję
A wydaje mi się, że powinno być elf 32bit, by późniejsze kompilacje generowały kod zjadliwy dla docelowego procesora.
Zaznaczam, że w temacie takich kompilacji jestem kompletnie zielony, informacje na ten temat zbieram tu i ówdzie, ale brakuje mi jakiegoś porządnego podręcznika systemowego dotyczącego tego tematu, dlatego tak chaotycznie to wszystko wygląda.
Ps. Próbowałem przy poleceniu configure podać --disable-multilib, efekt bez zmian.
A może tak to ma być, że as dla docelowej architektury ma być 64bit (jak moja architektura - gospodarza) by as uruchomił się i wygenerował odpowiedni, docelowy kod?
[Dodano: 2008-11-25, 17:24]
Wychodzi na to, że wszystko w porządku. Mam gcc i g++, faktycznie generują 32bitowy kod dla Renesans SuperH, czyli tak jak powinno być.
Teraz mam inny problem, używam jądra (to podstawa, jak mi wyjdzie to będę wiedział, że robię dobrze). Wyeksportowałem łatkę na taki:
przy czym:
Czyli tam, gdzie wcześniej miałem --prefix dla binutils i gcc.
Kontynuuję kompilację poprzez:
i jest dobrze, póki nie dojdzie do:
Wtedy wywala coś takiego:
A kompilacja zatrzymuje się.
Moje pytanie brzmi: błąd w źródłach, czy może ja coś pominąłem? Dodam, że $tulczajn/include jest puste może o to chodzi?
[Dodano: 2008-11-25, 17:50]
Przyjrzawszy się bliżej konfiguracji jądra okazuje się, że docelowy procesor po prostu nie obsługuje hugetlb.
[Dodano: 2008-11-26, 11:56]
Okazuje się także, że same kompilatory nie wystarczą. Problem przy kompilacji pakietu gcc pojawiał się, gdy dochodziło do libgcc. Wywalało brak stdio.h i innych podstawowych plików nagłówkowych, a ja nie wiem gdzie tego szukać. Poszedłem na łatwiznę i przy gcc zrobiłem
Kompilując ten sam pakiet w ten sam sposób, za to bez parametru target przechodzi gładko i idzie godzinami.
Gdzie mogę znaleźć te przeklęte podstawowe pliki nagłówkowe?
Edycja:
Dla wszystkich poszukujących, rozwiązaniem jest crosstool, okazuje się, że pakiety, które ściągałem są albo zbyt nowe, albo niekompatybilne ze sobą. Crosstool wygenerował mi niezbędny toolchain, nieśmiertelne ,,hello world'' ruszyło na docelowej maszynie.
Pragnę zaznaczyć, że jądro 2.6.26 nie działa.
Kod: Zaznacz cały
debian:/home/lis6502/Desktop/sh3/tulczajn/bin# file sh3-elf-as
Kod: Zaznacz cały
sh3-elf-as: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
Zaznaczam, że w temacie takich kompilacji jestem kompletnie zielony, informacje na ten temat zbieram tu i ówdzie, ale brakuje mi jakiegoś porządnego podręcznika systemowego dotyczącego tego tematu, dlatego tak chaotycznie to wszystko wygląda.
Ps. Próbowałem przy poleceniu configure podać --disable-multilib, efekt bez zmian.
A może tak to ma być, że as dla docelowej architektury ma być 64bit (jak moja architektura - gospodarza) by as uruchomił się i wygenerował odpowiedni, docelowy kod?
[Dodano: 2008-11-25, 17:24]
Wychodzi na to, że wszystko w porządku. Mam gcc i g++, faktycznie generują 32bitowy kod dla Renesans SuperH, czyli tak jak powinno być.
Teraz mam inny problem, używam jądra (to podstawa, jak mi wyjdzie to będę wiedział, że robię dobrze). Wyeksportowałem łatkę na taki:
Kod: Zaznacz cały
lis6502@debian:~/Desktop/sh3/linux-source-2.6.26$ export PATH=$tulczajn/bin:$PATH
Kod: Zaznacz cały
lis6502@debian:~/Desktop/sh3/linux-source-2.6.26$ echo $tulczajn
/home/lis6502/Desktop/sh3/tulczajn/
Kontynuuję kompilację poprzez:
Kod: Zaznacz cały
lis6502@debian:~/Desktop/sh3/linux-source-2.6.26$ make ARCH=sh CROSS_COMPILE=sh-elf-linux-
Kod: Zaznacz cały
CC arch/sh/mm/hugetlbpage.o
Kod: Zaznacz cały
In file included from include/linux/hugetlb.h:11,
from arch/sh/mm/hugetlbpage.c:14:
include/asm/hugetlb.h: In function ‘prepare_hugepage_range’:
include/asm/hugetlb.h:19: error: ‘HPAGE_SHIFT’ undeclared (first use in this function)
include/asm/hugetlb.h:19: error: (Each undeclared identifier is reported only once
include/asm/hugetlb.h:19: error: for each function it appears in.)
make[1]: *** [arch/sh/mm/hugetlbpage.o] Błąd 1
make: *** [arch/sh/mm] Błąd 2
Moje pytanie brzmi: błąd w źródłach, czy może ja coś pominąłem? Dodam, że $tulczajn/include jest puste może o to chodzi?
[Dodano: 2008-11-25, 17:50]
Przyjrzawszy się bliżej konfiguracji jądra okazuje się, że docelowy procesor po prostu nie obsługuje hugetlb.
[Dodano: 2008-11-26, 11:56]
Okazuje się także, że same kompilatory nie wystarczą. Problem przy kompilacji pakietu gcc pojawiał się, gdy dochodziło do libgcc. Wywalało brak stdio.h i innych podstawowych plików nagłówkowych, a ja nie wiem gdzie tego szukać. Poszedłem na łatwiznę i przy gcc zrobiłem
Kod: Zaznacz cały
make all-gcc && make install-gcc
Gdzie mogę znaleźć te przeklęte podstawowe pliki nagłówkowe?
Edycja:
Dla wszystkich poszukujących, rozwiązaniem jest crosstool, okazuje się, że pakiety, które ściągałem są albo zbyt nowe, albo niekompatybilne ze sobą. Crosstool wygenerował mi niezbędny toolchain, nieśmiertelne ,,hello world'' ruszyło na docelowej maszynie.
Pragnę zaznaczyć, że jądro 2.6.26 nie działa.