Кросскомпиляция — как это работает.
Кроме bitbake одной из ключевых частей OpenEmbedded является инструментарий кросс-сборки или, как его чаще называют, cross-toolchain. Именно он осуществляет генерацию исполняемых файлов из исходного кода для целевой платформы. Хотя на первый взгляд кажется, что эта задача отличается от обычного процесса сборки, но на самом деле это не так. Все действия , которые осуществляются компилятором в процессе обычной сборки, так же осуществляются при кросс-сборке. Единственное существующее отличие – это целевая платформа.
Теперь давайте рассмотрим действия происходящие при сборке. Хотя обычно они скрыты от вас, но выполняются они всегда:
- Трансляция исходного кода программы в ассемблерный код
- Трансляция ассемблерного кода в команды процессора
- Компоновка полученного кода с библиотеками
Я выделил только основные действия. Помимо этого, к примеру, сначала производится обработка кода препроцессором. Но компилятор, к примеру gcc, осуществляет трансляцию исходного кода в ассемблерный код. Хотя это и кажется простым, но создание хороших компиляторов это все еще Rocket Science в программировании. Далее полученный ассемблерный код при помощи утилит из коллекции binutils транслируется в команды процессора и линкуется с библиотеками. В результате чего получается исполняемый файл. Ни одно из этих действий не требует обязательного запуска на целевой платформе, напротив – нам требуется только описание команд процессора. Что и позволяет осуществлять генерацию исполняемых файлов для платформы отличной от платформы запуска инструментария сборки.
Таким образом, чтобы осуществить генерацию кода для платформы, отличной от платформы запуска, необходимо собрать компилятор, ассемблер и компоновщик таким образом, чтобы при своей работе они создавали файлы для целевой платформы. И все вместе они будут являться инструментарием кросс-сборки (cross-toolchain). Конечно, кроме компилятора, ассемблера и компоновщика в этот инструментарий обычно входит стандартная библиотека C (glibc, uclibc и тому подобные), но на самом деле она требуется для компоновщика и ваших программ, но никак не для самого инструментария кросс-сборки.
Но откуда же берется сложность при кросс-сборке, если все так просто? На самом деле проблема в том, что кроме компилятора, ассемблера и компоновщика в процессе участвуют autotools и прочие утилиты настройки скриптов сборки, которые далеко не всегда приспособлены к осуществлению кросс-сборки. Это в том числе касается и самого инструментария кросс-сборки. OpenEmbedded же позволяет избавиться от этих проблем. Все включаемые в него пакеты проверяются на корректность процесса кросс-сборки и адаптируются по необходимости, в том числе и инструментарий кросс-сборки.
Рубрика: Теория | Теги: openembedded, встроеннные системы, кросскомпиляция Коментировать »