Compilare il kernel a 32 bit su una macchina a 64 bit


23

Sto cercando di compilare un kernel per una macchina Intel Atom single-core a 32 bit. Inutile dire che la compilazione richiede quantità eccessive di tempo. Funziona da 2 ore ed è ancora solo a metà dei moduli driver.

Compilare un kernel sul mio desktop principale richiede solo 15 minuti ma è una macchina a 64 bit. Posso eseguire la compilazione incrociata per generare un pacchetto kernel a 32 bit dalla macchina migliore?


La macchina virtuale può farlo, ma sarà più lenta
— Tachyons,

1
Sì e potrei eseguire il dual boot, ma sono sicuro che è possibile compilare cose per altre piattaforme senza uscire dall'ambiente attuale.
— Oli

Questo è interessante +1 ed
— Tachyons,

Risposte:


27

Mentre il kernel può essere compilato in modo incrociato, il modo più semplice è creare un chroot a 32 bit (i386) e costruirlo lì.

Installa ubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

Crea un chroot i386:

$ mk-sbuild --arch=i386 precise

(Probabilmente dovrai eseguirlo due volte. La prima volta, si installa schrootecc. E si configura mk-sbuild)

Quindi inserire il chroot:

$ schroot -c precise-i386

E compila il kernel, come faresti normalmente.


11
Costruire in un chroot è esattamente il metodo preferito usato dagli sviluppatori nel team del kernel Ubuntu.
— Colin Ian King,

Questi sono alcuni strumenti dall'aspetto piuttosto elegante. Ci proverò domani. Grazie.
— Oli

Espandi "come faresti normalmente". Seguirei normalmente le istruzioni su help.ubuntu.com/community/Kernel/Compile ma non funzionano all'interno di un chroot - la build muore con "errore fatale: linux / compiler.h: nessun file o directory simile"
— Alistair Buxton

Montare la tua cartella home in chroots sembra una bella aggiunta: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
— int_ua

5

Inoltre, in gcc, è possibile impostare -m32flag per consentire la compilazione di sorgenti Linux in eseguibili a 32 bit. Non ho una vasta conoscenza dei Makefile, ma puoi modificarli.

modifica: volevo aggiungere una domanda da StackOverflow qui, in cui viene detto di impostare cflags:

export CFLAGS=-m32

E dal repository Linux nell'account github di Torvalds , ho trovato la seguente sezione sul makefile principale che potresti trovare utile, poiché dice che puoi impostare un'architettura di destinazione impostando una variabile di ambiente. Leggi i commenti, attualmente, queste righe provengono da questo file , tra le righe 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.