Compilar kernel de 32 bits en una máquina de 64 bits

23

Estoy tratando de compilar un kernel para una máquina Intel Atom de núcleo único de 32 bits. No hace falta decir que la compilación está tomando demasiado tiempo. Ha estado funcionando durante 2 horas y todavía está a la mitad de los módulos del controlador.

Compilar un kernel en mi escritorio principal solo toma 15 minutos, pero es una máquina de 64 bits. ¿Puedo realizar una compilación cruzada para generar un paquete de kernel de 32 bits desde la mejor máquina?

Oli
fuente
La máquina virtual puede hacerlo, pero será más lenta
Tachyons
1
Sí, podría hacer un arranque dual, pero estoy seguro de que es posible compilar cosas para otras plataformas sin salir del entorno actual.
Oli
Eso es interesante +1 ed
Tachyons

Respuestas:

27

Si bien el núcleo se puede compilar de forma cruzada, la forma más fácil es crear un chroot de 32 bits (i386) y construirlo allí.

Instalar ubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

Crea un chroot i386:

$ mk-sbuild --arch=i386 precise

(Probablemente tendrá que ejecutar eso dos veces. La primera vez, se instala, schrootetc. y se configura mk-sbuild)

Luego ingrese el chroot:

$ schroot -c precise-i386

Y construya el núcleo, como lo haría normalmente.

planta rodadora
fuente
11
Construir en un chroot es exactamente el método preferido utilizado por los desarrolladores en el equipo del kernel de Ubuntu.
Colin Ian King
Esas son algunas herramientas muy elegantes. Lo intentaré mañana. Gracias.
Oli
Amplíe "como lo haría normalmente". Normalmente seguiría las instrucciones en help.ubuntu.com/community/Kernel/Compile pero no funcionan dentro de un chroot - la compilación muere con 'error fatal: linux / compiler.h: No existe tal archivo o directorio'
Alistair Buxton
Montar su carpeta de inicio en chroots parece una buena adición: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
int_ua
5

Afaik, en gcc, puede establecer un -m32indicador para permitirle compilar fuentes de Linux en ejecutables de 32 bits. No tengo un amplio conocimiento sobre Makefiles, pero puedes modificarlos.

editar: quería agregar una pregunta de stackoverflow aquí, en la que se me dice que establezca cflags:

export CFLAGS=-m32

Y desde el repositorio de Linux en la cuenta github de Torvalds , encontré la siguiente sección en el archivo MAKE principal que puede serle útil, ya que le dice que puede establecer una arquitectura de destino configurando una variable de entorno. Lea los comentarios, actualmente, estas líneas son de este archivo , entre las líneas 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
Comunidad
fuente