Кросс-компиляция ядра Linux

Если необходимо скомпилировать нативный код для аппаратную архитектуры, отличной от той, к которой относится ваша рабочая машина, то для этого нужна кросс-компиляция. При сборке ядра Linux задача кросс-компиляции сильно упрощается тем, что нет нужды в кросс-компиляции каких-либо библиотек, достаточно иметь кросс-компилируюшщий компилятор С (пакет gcc), ассемблер и утилиты для работы с объектными файлами (все это входит в пакет binutils).

Отметим, что архитектуры amd64 и i386 считаются ядром идентичными и необходимости в создании кросс-компилятора нет. Мы рассмотрим созание кросс-компилятора для архитектуры arm.

Создание кросс-компилятора

Первым шагом является создание инструмента для кросс-компилцяии, который обычно называется "тулчейн для кросс-компиляции" (от cross-compile toolchain). Задачу в общем-то достаточно просто выполнить, собрав gcc и binutils вручную с нужными параметрами конфигурации, но для уменьшения ручной работы и унификации процесса воспользуемся программой для создания кросс-компиляторов под названием crosstool-ng.

Установка Crosstool-NG

Для начала нужно поставить необходимые пакеты, в частности клиент системы контроля версий CVS и библиотеку libncurses. Команда их установки для основанных на Debian дистрибутивов выглядит так.

sudo apt-get install cvs lzma libncurses5-dev build-essential automake

Теперь скачаем уи установими сам пакет crosstol-ng.

mkdir ~/packages; cd ~/packages
wget http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.8.2.tar.bz2
tar xf crosstool-ng-1.8.2.tar.bz2
cd crosstool-ng-1.8.2
./configure # читаем сообщения, может быть чего-то не хватает
make
sudo make install

Настройка и сборка кросс-компилятора

Для сборки нам понадобится какая-нибудь пустая директория и файл конфигурации. Для упрошения процесса можно воспользоваться готовыми файлом конфигурации cross-config-arm для архитектуры ARM (little endian).

mkdir ~/cross-tool; cd ~/cross-tool
wget -O .config http://dev.iu7.bmstu.ru/trac/corporate_docs/raw-attachment/wiki/UsingCrosstool/cross-config-arm

Можете сказать ct-ng menuconfig и посмотреть на вашу целевую архитектуру. Теперь соберём тулчейн.

cd ~/cross-tool
ct-ng build

Будут скачены и собраны исходники gcc и binutils, так что можете пойти попить чаю. В случае успеха они появятся в директории ~/x-tools. Внимание: процесс сборки лучше не прерывать, частично скаченные или распакованные архивы придется убивать вручную.

Использование кросс-компилятора

Добавим в переменную PATH диекторию с созданным тулчейном. Мы сделаем это для командной оболочки bash.

# ARM
echo export PATH=/home/$USER/x-tools/arm-unknown-eabi/bin:\$PATH >> ~/.bashrc

Не забудьте запустить новый экземпляр bash, чтобы изменения в файле ~/.bashrc вступили в силу.

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

# ARM
make ARCH=arm CROSS_COMPILE=arm-unknown-eabi-

Не забудьте создать или взять конфигурацию ядра.

Запуск

Если вы собрали Qemu? с поддержкой эмуляции ARM, то для запуска ядра можно использовать команду вида

qemu-system-arm -M versatilepb -kernel linux-source-2.6.26-arm/arch/arm/boot/zImage \
    -append "root=/dev/sda1 console=ttyAMA0" -hda debian_lenny_armel_small.qcow2 \
    -nographic -serial stdio -redir tcp:10122::22

На всякий случай так же выкладываю штатное ядро и initrd:

Использованы материалы с  http://people.debian.org/~aurel32/qemu/arm/.

Attachments