Kompilieren Sie den 32-Bit-Kernel auf einem 64-Bit-Computer

23

Ich versuche, einen Kernel für einen 32-Bit-Single-Core-Intel-Atom-Rechner zu kompilieren. Unnötig zu erwähnen, dass das Kompilieren übermäßig viel Zeit in Anspruch nimmt. Es dauert 2 Stunden und es ist immer noch nur die Hälfte der Treibermodule.

Das Kompilieren eines Kernels auf meinem Hauptdesktop dauert nur 15 Minuten, ist jedoch eine 64-Bit-Maschine. Kann ich Cross-Compile verwenden, um ein 32-Bit-Kernel-Paket auf dem besseren Computer zu generieren?

Oli
quelle
Virtuelle Maschine kann es, aber es wird langsamer sein
Tachyons
1
Ja, und ich könnte dual booten, aber ich bin mir sicher, dass es möglich ist, Dinge für andere Plattformen zu kompilieren, ohne die aktuelle Umgebung zu verlassen.
Oli
Das ist interessant +1 ed
Tachyons

Antworten:

27

Während der Kernel übergreifend kompiliert werden kann, ist es am einfachsten, ein 32-Bit-Chroot (i386) zu erstellen und dort einzubauen.

Installieren Sie ubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

Erstellen Sie eine i386-Chroot:

$ mk-sbuild --arch=i386 precise

(Sie müssen das wahrscheinlich zweimal ausführen. Beim ersten Mal wird es installiert schrootusw. und eingerichtet. mk-sbuild)

Dann betrete die Chroot:

$ schroot -c precise-i386

Und bauen Sie den Kernel wie gewohnt.

Tumbleweed
quelle
11
Das Erstellen einer Chroot ist genau die bevorzugte Methode für Entwickler im Ubuntu-Kernel-Team.
Colin Ian King
Das sind einige ziemlich ausgefallene Werkzeuge. Ich werde es morgen versuchen. Vielen Dank.
Oli
Erweitern Sie bitte "wie gewohnt". Normalerweise folge ich den Anweisungen unter help.ubuntu.com/community/Kernel/Compile, aber sie funktionieren nicht in einer Chroot - der Build stirbt mit 'schwerwiegendem Fehler: linux / compiler.h: Keine solche Datei oder Verzeichnis'
Alistair Buxton
Das Mounten Ihres Home-Ordners in chroots sieht nach einer schönen Ergänzung aus: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
int_ua
5

Afaik, in gcc können Sie -m32flag setzen, damit es Linux-Quellen zu 32-Bit-ausführbaren Dateien kompiliert. Ich habe keine großen Kenntnisse über Makefiles, aber Sie können sie optimieren.

edit: Ich wollte hier eine Frage von stackoverflow hinzufügen , in der gesagt wird, dass cflags gesetzt werden sollen:

export CFLAGS=-m32

Und aus dem Linux-Repository in Torvalds 'Github-Konto habe ich den folgenden Abschnitt im Haupt-Makefile gefunden, der möglicherweise nützlich ist, da er besagt, dass Sie eine Zielarchitektur festlegen können, indem Sie eine Umgebungsvariable festlegen. Lesen Sie die Kommentare, derzeit sind diese Zeilen aus dieser Datei , zwischen den Zeilen 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
Gemeinschaft
quelle