Скомпилировать 32-битное ядро ​​на 64-битной машине


23

Я пытаюсь собрать ядро ​​для 32-битной одноядерной машины Intel Atom. Излишне говорить, что компиляция занимает слишком много времени. Это продолжается в течение 2 часов, и это все еще только на полпути через модули драйвера.

Компиляция ядра на моем главном рабочем столе занимает всего 15 минут, но это 64-битная машина. Могу ли я выполнить кросс-компиляцию для генерации 32-битного пакета ядра с лучшей машины?


Виртуальная машина может сделать это, но это будет медленнее
Tachyons

1
Да, и я мог бы выполнить двойную загрузку, но я уверен, что можно компилировать вещи для других платформ, не выходя из текущей среды.
Оли

Это интересно +1 ред
Тахионс

Ответы:


27

Хотя ядро ​​может быть кросс-скомпилировано, самый простой способ - создать 32-битный (i386) chroot и встроить его в него.

Установить ubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

Создайте chroot для i386:

$ mk-sbuild --arch=i386 precise

(Вам, вероятно, придется выполнить это дважды. В первый раз он устанавливает schrootи т. Д. И настраивается mk-sbuild)

Затем введите chroot:

$ schroot -c precise-i386

И соберите ядро, как обычно.


11
Встраивание в chroot является именно предпочтительным методом, который используется разработчиками в команде ядра Ubuntu.
Колин Ян Кинг,

Это довольно необычные инструменты. Я сделаю это завтра. Спасибо.
Оли

Пожалуйста, опишите «как обычно». Обычно я следовал бы инструкциям по адресу help.ubuntu.com/community/Kernel/Compile, но они не работают внутри chroot - сборка умирает с «фатальной ошибкой: linux / compiler.h: такого файла или каталога нет»
Алистер Бакстон

Монтирование вашей домашней папки в chroot выглядит как хорошее дополнение: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
int_ua

5

Afaik, в gcc вы можете установить -m32флаг, чтобы он мог компилировать исходники linux в 32-битные исполняемые файлы. Я не очень разбираюсь в Makefiles, но вы можете настроить их.

edit: я хотел добавить вопрос из stackoverflow , в котором сказано установить cflags:

export CFLAGS=-m32

А из репозитория linux в учетной записи Торвальдса на github я обнаружил следующий раздел основного make-файла, который может оказаться полезным, поскольку он говорит о том, что вы можете установить целевую архитектуру, установив переменную окружения. Прочитайте комментарии, в настоящее время эти строки из этого файла , между строками 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.