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

Что такое кросс-компиляция?

Кросс-компиляция—это использование компилятора в одной системе для разработки кода программы, которая будет работать на другой. Кросс-компиляция относительно редко используется неквалифицированными пользователями UNIX, так как обычно компилятор в системе устанавливается для использования именно в этой системе. Однако кросс-компиляция становится вполне обычной (и необходимой) при разработке для конкретных встраиваемых платформ. Даже когда у основной и у целевой систем одинаковая архитектура, необходимо различать их компиляторы; у них могут быть разные версии библиотек или же библиотеки могут быть собраны с разными параметрами компилятора, поэтому программа, собранная компилятором основного компьютера, может не заработать на целевой системе или будет вести себя непредсказуемо.

Получение инструментов кросс-компиляции

Теоретически вполне возможно собрать кросс-компилятор самостоятельно, но на практике это делается редко. Необходимый ряд этапов самокомпиляции (bootstrap) может быть трудным и требующим времени процессом, часто при этом требуется собрать минимальный компилятор, который используется для частичного конфигурирования и сборки библиотек, заголовочные файлы которых затем используются для пересборки компилятора, чтобы тот мог использовать их, и так далее. Имеется ряд коммерческих источников работающих кросс-компиляторов для различных сочетаний архитектур, а также несколько свободных наборов для кросс-компиляции.

Знакомство с crosstool-ng

Инструмент Crosstool Дана Кегеля (Dan Kegel) (подробности см. в Ресурсах)—это сочетание профессиональных знаний и специализированных патчей для автоматической сборки инструментариев компиляции (toolchain) для различных систем. Crosstool уже некоторое время не обновляется, но на его основе был создан новый проект, crosstool-ng. Для этого руководства я использовал crosstool-ng версии 1.1.0, выпущенной в мае 2008 года. Скачать его можно с сайта проекта (см. Ресурсы).

Установка crosstool-ng

У crosstool-ng есть скрипт configure . Для настройки нужно просто запустить этот скрипт с параметром –prefix для указания местоположения. Например:

$ ./configure –prefix=$HOME/7800/ctng

После настройки пакет собирается с помощью make а затем make install. В процессе сборки создается каталог ctng в рабочем каталоге 7800, в котором содержатся скрипты сборки crosstool-ng. Добавьте подкаталог ctng/bin к своей переменной среды PATH:

$ PATH=$PATH:$HOME/7800/ctng/bin

Настройка crosstool-ng

В Crosstool-ng используется файл .config , похожий на те, которые используются ядром Linux. Чтобы работать с crosstool-ng, необходимо создать конфигурационный файл, соответствующей целевой системе. Создайте рабочий каталог для сборки crosstool-ng:

$ mkdir toolchain-build $ cd toolchain-build

Теперь скопируйте сюда стандартную конфигурацию. Настроить crosstool-ng можно и вручную, но один из примеров конфигурации идеально подходит к целевой системе:

$ cp ../ctng/lib/ct-ng-1.1.0/samples/arm-unknown-linux-uclibc/* .

Наконец, переименуйте файл crosstool.config:

$ mv crosstool.config .config

Эта команда копирует конфигурационный файл, предназначенный для процессора armv5te, используемого в TS-7800. Он собирается с uClibc, вариантом libc, предназначенным для встраиваемых систем. Однако требуется одно изменение в конфигурационном файле.

Исправление пути в настройках

По умолчанию целевым каталогом для сборки crosstool-ng является $HOME/x-tools/$TARGET. Например, в случае этой сборки получился бы каталог x-tools/arm-unknown-linux-uclibc. Это очень удобно при сборке для нескольких целевых систем, но не так удобно, если сборка делается только для одной системы. Отредактируйте файл .config и измените значение CT_PREFIX_DIR на ${HOME}/7800/toolchain.

Сборка toolchain

Чтобы собрать toolchain, нужно запустить скрипт ct-ng с аргументом build Для повышения производительности, в особенности на многоядерной системе, может быть полезно запустить несколько задач, что указывается как build.#. Например, вот эта команда делает сборку с четырьмя задачами:

$ ct-ng build.4

Процесс может занять довольно много времени, в зависимости от используемой основной системы. Затем набор утилит будет установлен в $HOME/7800/toolchain. Этот каталог и его содержимое доступны только для чтения; если нужно удалить или переместить их, примените chmod u+w Скрипт ct-ng принимает и другие аргументы, например, help. Нужно иметь в виду, что ct-ng—это скрипт для стандартной утилиты make, и поэтому результатом применения параметра –help является просто стандартная справка make; для получения справки по crosstool-ng нужно использовать ct-ng help.

Если вам не доводилось видеть этот трюк раньше, то он производит впечатление. Современные UNIX-системы интерпретируют исполняемые файлы, начинающиеся с #! , как скрипт, а именно, скрипт для программы, имя которой указано далее в этой же строке. Например, многие shell-скрипты начинаются с #!/bin/sh. Имя файла передается программе. Для программ, которые рассматривают свой первый аргумент как скрипт для запуска, этого достаточно. Так как make не делает этого автоматически, ему можно передать имя файла для запуска с помощью флага -f. Первая строка ct-ng это #!/usr/bin/make -rf. Флаг -r подавляет встроенные правила сборки по умолчанию для make, а флаг -f сообщает ему, что следующее слово (которое является именем файла скрипта) - это имя файла, который нужно использовать вместо файла с именем Makefile. Результатом является выполняемый скрипт, использующий синтаксис make вместо синтаксиса shell.

Использование toolchain

Для начала добавьте каталог, содержащий компилятор, к своей переменной PATH:

$ PATH=~/7800/toolchain/bin:$PATH

Теперь можно компилировать программы:

$ arm-unknown-linux-uclibc-gcc -o hello hello.c $ file hello hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), not stripped

А где библиотеки?

Библиотеки, которые использует toolcahain, хранятся в подкаталоге arm-unknown-linux-uclibc/sys-root каталога toolchain . Этот каталог формирует основу конечной корневой файловой системы (эту тему мы рассмотрим в разделе Файловые системы, после сборки ядра).

Настройка ядра

Дерево исходных текстов ядра поставляется уже настроенным для кросс-компиляции. В простейшем случае (это наш случай) единственное, что нужно сделать, - это настроить переменную CROSS_COMPILE в файле Makefile самого верхнего уровня. Это префикс, который добавляется к началу имен различных программ (gcc, as, ld), используемых во время сборки. Например, если переменной CROSS_COMPILE дать значение arm-, процесс компиляции будет пытаться найти программу с именем arm-gcc в известных путях. Таким образом, для данной сборки правильным значением будет arm-unknown-linux-uclibc. Или, если не хочется полагаться на настройки PATH, можно указать путь целиком, как в этом примере:

CROSS_COMPILE ?= $(HOME)/7800/toolchain/bin/arm-unknown-linux-uclibc-

материал взят с сайта ibm.com

 
/home/starterkit/wiki.starterkit.ru/data/pages/cross_compiler.txt · Последние изменения: 2009/04/12 17:02 От ms
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki