Compile o kernel de 32 bits na máquina de 64 bits

23

Estou tentando compilar um kernel para uma máquina Intel Atom de núcleo único de 32 bits. Escusado será dizer que a compilação está demorando quantidades excessivas de tempo. Já dura 2 horas e ainda está na metade dos módulos de driver.

Compilar um kernel na minha área de trabalho principal leva apenas 15 minutos, mas é uma máquina de 64 bits. Posso fazer a compilação cruzada para gerar um pacote de kernel de 32 bits a partir da máquina melhor?

Oli
fonte
Máquina virtual pode fazê-lo, mas ele vai ser mais lento
Tachyons
1
Sim, eu poderia inicializar duas vezes, mas tenho certeza que é possível compilar coisas para outras plataformas sem sair do ambiente atual.
Oli
Isso é interessante +1 ed
Tachyons

Respostas:

27

Embora o kernel possa ser compilado de forma cruzada, a maneira mais fácil é criar um chroot de 32 bits (i386) e construí-lo lá.

Instalar ubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

Crie um chroot i386:

$ mk-sbuild --arch=i386 precise

(Você provavelmente precisará executá-lo duas vezes. Na primeira vez, ele instala schrootetc. e configura mk-sbuild)

Em seguida, digite o chroot:

$ schroot -c precise-i386

E construa o kernel, como faria normalmente.

tumbleweed
fonte
11
Construir em um chroot é exatamente o método preferido usado pelos desenvolvedores na equipe do kernel do Ubuntu.
Colin Ian rei
Essas são algumas ferramentas bastante elegantes. Eu vou tentar amanhã. Obrigado.
Oli
Por favor, expanda "como faria normalmente". Normalmente, eu seguiria as instruções em help.ubuntu.com/community/Kernel/Compile, mas elas não funcionam dentro de um chroot - a compilação morre com 'erro fatal: linux / compiler.h: não existe esse arquivo ou diretório'
Alistair Buxton
Montando sua pasta pessoal no chroots parece uma boa adição: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
int_ua
5

Depois, no gcc, você pode configurar o -m32sinalizador para permitir que ele compile fontes linux para executáveis ​​de 32 bits. Eu não tenho um amplo conhecimento sobre Makefiles, mas você pode ajustá-los.

edit: Eu queria adicionar uma pergunta do stackoverflow aqui, na qual é solicitado que você defina cflags:

export CFLAGS=-m32

E no repositório linux da conta do github do Torvalds , encontrei a seção a seguir no makefile principal que você pode achar útil, pois indica que você pode definir uma arquitetura de destino definindo uma variável de ambiente. Leia os comentários, atualmente, estas linhas são deste arquivo , entre as linhas 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
Comunidade
fonte