Compiler le noyau 32 bits sur une machine 64 bits

23

J'essaie de compiler un noyau pour une machine Intel Atom monocœur 32 bits. Inutile de dire que la compilation prend énormément de temps. Cela dure depuis 2 heures et ce n'est encore qu'à mi-chemin des modules du pilote.

Compiler un noyau sur mon bureau principal ne prend que 15 minutes mais c'est une machine 64 bits. Puis-je effectuer une compilation croisée pour générer un package de noyau 32 bits à partir de la meilleure machine?

Oli
la source
La machine virtuelle peut le faire, mais elle sera plus lente
Tachyons
1
Ouais et je pourrais faire un double démarrage, mais je suis sûr qu'il est possible de compiler quelque chose pour d'autres plates-formes sans quitter l'environnement actuel.
Oli
C'est intéressant +1 ed
Tachyons

Réponses:

27

Bien que le noyau puisse être compilé de manière croisée, le moyen le plus simple est de créer un chroot 32 bits (i386) et de le construire dedans.

Installer ubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

Créez un chroot i386:

$ mk-sbuild --arch=i386 precise

(Vous devrez probablement l'exécuter deux fois. La première fois, il installe schrootetc. et configure mk-sbuild)

Entrez ensuite le chroot:

$ schroot -c precise-i386

Et construisez le noyau, comme vous le feriez normalement.

tumbleweed
la source
11
Construire dans un chroot est exactement la méthode préférée telle qu'utilisée par les développeurs de l'équipe du noyau Ubuntu.
Colin Ian King
Ce sont des outils assez sophistiqués. Je vais essayer demain. Merci.
Oli
Veuillez développer "comme vous le feriez normalement". Je suivrais normalement les instructions sur help.ubuntu.com/community/Kernel/Compile mais elles ne fonctionnent pas dans un chroot - la construction meurt avec 'erreur fatale: linux / compiler.h: aucun fichier ou répertoire'
Alistair Buxton
Le montage de votre dossier de départ dans les chroots ressemble à un ajout intéressant: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
int_ua
5

Afaik, dans gcc, vous pouvez définir un -m32indicateur pour lui permettre de compiler des sources linux en exécutables 32 bits. Je n'ai pas une grande connaissance des Makefiles, mais vous pouvez les modifier.

edit: je voulais ajouter une question de stackoverflow ici, dans laquelle il est dit de définir cflags:

export CFLAGS=-m32

Et à partir du référentiel Linux dans le compte github de Torvalds , j'ai trouvé la section suivante sur le makefile principal qui peut vous être utile, car elle indique que vous pouvez définir une architecture cible en définissant une variable d'environnement. Lisez les commentaires, actuellement, ces lignes proviennent de ce fichier , entre les lignes 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
Communauté
la source