Kompilasi kernel 32bit pada mesin 64bit

23

Saya mencoba mengkompilasi kernel untuk mesin Intel Atom 32-bit single-core. Tak perlu dikatakan, kompilasi ini mengambil banyak waktu. Sudah berjalan selama 2 jam dan masih hanya setengah jalan melalui modul driver.

Mengkompilasi kernel pada desktop utama saya hanya membutuhkan waktu 15 menit tetapi ini adalah mesin 64bit. Dapatkah saya melakukan cross compile untuk menghasilkan paket kernel 32bit dari mesin yang lebih baik?

Oli
sumber
Mesin virtual dapat melakukannya, tetapi akan lebih lambat
Tachyons
1
Ya dan saya bisa dual boot, tapi saya yakin itu mungkin untuk mengkompilasi sesuatu untuk platform lain tanpa meninggalkan lingkungan saat ini.
Oli
Itu menarik +1 ed
Tachyons

Jawaban:

27

Sementara kernel dapat dikompilasi silang, cara termudah adalah membuat chroot 32bit (i386) dan membangunnya di sana.

Pasang ubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

Buat chroot i386:

$ mk-sbuild --arch=i386 precise

(Anda mungkin harus menjalankan itu dua kali. Pertama kali, itu menginstal schrootdll dan mengatur mk-sbuild)

Lalu masukkan chroot:

$ schroot -c precise-i386

Dan membangun kernel, seperti yang Anda lakukan, secara normal.

tumbleweed
sumber
11
Membangun chroot adalah metode yang lebih disukai seperti yang digunakan oleh pengembang di tim kernel Ubuntu.
Colin Ian King
Itu adalah beberapa alat yang terlihat sangat mewah. Saya akan mencobanya besok. Terima kasih.
Oli
Harap rentangkan "seperti biasa". Saya biasanya mengikuti petunjuk di help.ubuntu.com/community/Kernel/Compile tetapi mereka tidak bekerja di dalam chroot - build mati dengan 'fatal fatal: linux / compiler.h: Tidak ada file atau direktori'
Alistair Buxton
Memasang folder rumah Anda di chroots terlihat seperti tambahan yang bagus: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
int_ua
5

Afaik, di gcc, Anda dapat mengatur -m32flag untuk membiarkannya mengkompilasi sumber linux ke executable 32bit. Saya tidak memiliki pengetahuan luas tentang Makefiles, tetapi Anda dapat mengubah mereka.

sunting: Saya ingin menambahkan pertanyaan dari stackoverflow di sini, di mana ia diberi tahu untuk mengatur cflags:

export CFLAGS=-m32

Dan dari repositori linux di akun github Torvalds , saya menemukan bagian berikut di makefile utama yang mungkin berguna bagi Anda, karena memberitahu Anda dapat mengatur arsitektur target dengan mengatur variabel lingkungan. Baca komentar, saat ini, baris ini dari file ini , antara baris 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
Komunitas
sumber