Skompiluj jądro 32-bitowe na komputerze 64-bitowym

23

Próbuję skompilować jądro dla 32-bitowej jedno-rdzeniowej maszyny Intel Atom. Nie trzeba dodawać, że kompilacja zajmuje nadmiernie dużo czasu. Trwa od 2 godzin i wciąż jest dopiero w połowie modułów sterownika.

Kompilacja jądra na głównym pulpicie zajmuje tylko 15 minut, ale jest to 64-bitowa maszyna. Czy mogę krzyżować kompilację, aby wygenerować 32-bitowy pakiet jądra z lepszej maszyny?

Oli
źródło
Maszyna wirtualna może to zrobić, ale będzie wolniejsza
Tachyons,
1
Tak i ja mogliśmy uruchomić podwójnie, ale jestem pewien, że można skompilować coś dla innych platform bez wychodzenia z obecnego środowiska.
Oli
To ciekawe +1 edycja
Tachyons,

Odpowiedzi:

27

Podczas gdy jądro może być kompilowane krzyżowo, najprostszym sposobem jest utworzenie 32-bitowego (i386) chroota i tam go wbudować.

Zainstaluj ubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

Utwórz chroot i386:

$ mk-sbuild --arch=i386 precise

(Prawdopodobnie będziesz musiał uruchomić to dwa razy. Za pierwszym razem instaluje się schrootitp. mk-sbuild)

Następnie wprowadź chroot:

$ schroot -c precise-i386

I zbuduj jądro, jak zwykle.

tumbleweed
źródło
11
Budowanie w chroot jest dokładnie preferowaną metodą stosowaną przez programistów w zespole jądra Ubuntu.
Colin Ian King
To są niektóre fantazyjnie wyglądające narzędzia. Spróbuję jutro. Dzięki.
Oli
Rozwiń „jak zwykle”. Zwykle postępuję zgodnie z instrukcjami na help.ubuntu.com/community/Kernel/Compile, ale nie działają one w chroot - kompilacja umiera z „krytycznym błędem: linux / compiler.h: Brak takiego pliku lub katalogu”
Alistair Buxton
Zamontowanie folderu domowego w chroots wygląda jak miły dodatek: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
int_ua
5

Afaik, w gcc, możesz ustawić -m32flagę, aby kompilowała źródła linuksowe do 32-bitowych plików wykonywalnych. Nie mam szerokiej wiedzy na temat Makefiles, ale możesz je ulepszyć.

edycja: Chciałem tutaj dodać pytanie z stackoverflow , w którym powiedziano, aby ustawić cflags:

export CFLAGS=-m32

A z repozytorium linuxa na koncie github Torvaldsa znalazłem następującą sekcję na głównym makefile, która może ci się przydać, ponieważ mówi, że możesz ustawić architekturę docelową poprzez ustawienie zmiennej środowiskowej. Przeczytaj komentarze, obecnie te wiersze pochodzą z tego pliku , między wierszami 174–196 :

# Cross compiling and selecting different set of gcc/bin-utils
# ---------------------------------------------------------------------------
#
# When performing cross compilation for other architectures ARCH shall be set
# to the target architecture. (See arch/* for the possibilities).
# ARCH can be set during invocation of make:
# make ARCH=ia64
# Another way is to have ARCH set in the environment.
# The default ARCH is the host where make is executed.

# CROSS_COMPILE specify the prefix used for all executables used
# during compilation. Only gcc and related bin-utils executables
# are prefixed with $(CROSS_COMPILE).
# CROSS_COMPILE can be set on the command line
# make CROSS_COMPILE=ia64-linux-
# Alternatively CROSS_COMPILE can be set in the environment.
# A third alternative is to store a setting in .config so that plain
# "make" in the configured kernel build directory always uses that.
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH        ?= $(SUBARCH)
CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)

# ...
# There are more architecture related stuff beyond this line
Społeczność
źródło