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.