Меню Рубрики

Arm linux gnueabihf gcc linaro

Кросскомпиляция под ARM

Достаточно давно хотел освоить сабж, но всё были другие более приоритетные дела. И вот настала очередь кросскомпиляции.

В данном посте будут описаны:

  1. Инструменты
  2. Элементарная технология кросскомпиляции
  3. И, собственно, HOW2

Кому это интересно, прошу под кат.

Вводная

Одно из развивающихся направлений в современном IT это IoT. Развивается это направление достаточно быстро, всё время выходят всякие крутые штуки (типа кроссовок со встроенным трекером или кроссовки, которые могут указывать направление, куда идти (специально для слепых людей)). Основная масса этих устройств представляют собой что-то типа «блютуз лампочки», но оставшаяся часть являет собой сложные процессорные системы, которые собирают данные и управляют этим огромным разнообразием всяких умных штучек. Эти сложные системы, как правило, представляют собой одноплатные компьютеры, такие как Raspberry Pi, Odroid, Orange Pi и т.п. На них запускается Linux и пишется прикладной софт. В основном, используют скриптовые языки и Java. Но бывают приложения, когда необходима высокая производительность, и здесь, естественно, требуются C и C++. К примеру, может потребоваться добавить что-то специфичное в ядро или, как можно быстрее, высчитать БПФ. Вот тут-то и нужна кросскомпиляция.

Если проект не очень большой, то его можно собирать и отлаживать прямо на целевой платформе. А если проект достаточно велик, то компиляция на целевой платформе будет затруднительна из-за временных издержек. К примеру, попробуйте собрать Boost на Raspberry Pi. Думаю, ожидание сборки будет продолжительным, а если ещё и ошибки какие всплывут, то это может занять ох как много времени.

Поэтому лучше собирать на хосте. В моём случае, это i5 с 4ГБ ОЗУ, Fedora 24.

Инструменты

Для кросскомпиляции под ARM требуются toolchain и эмулятор платформы либо реальная целевая платформа.

Т.к. меня интересует компиляция для ARM, то использоваться будет и соответствующий toolchain.

Toolchain’ы делятся на несколько типов или триплетов. Триплет обычно состоит из трёх частей: целевой процессор, vendor и OS, vendor зачастую опускается.

  • *-none-eabi — это toolchain для компиляции проекта работающего в bare metal.
  • *eabi — это toolchain для компиляции проекта работающего в какой-либо ОС. В моём случае, это Linux.
  • *eabihf — это почти то же самое, что и eabi, с разницей в реализации ABI вызова функций с плавающей точкой. hf — расшифровывается как hard float.

Описанное выше справедливо для gcc и сделанных на его базе toolchain’ах.

Сперва я пытался использовать toolchain’ы, которые лежат в репах Fedora 24. Но был неприятно удивлён этим:

Поискав, наткнулся на toolchain от компании Linaro. И он меня вполне устроил.

Второй инструмент- это QEMU. Я буду использовать его, т.к. мой Odroid-C1+ пал смертью храбрых (нагнулся контроллер SD карты). Но я таки успел с ним чуток поработать, что не может не радовать.

Элементарная технология кросскомпиляции

Собственно, ничего необычного в этом нет. Просто используется toolchain в роли компилятора. А стандартные библиотеки поставляются вместе с toolchain’ом.

Какие ключи у toolchain’а можно посмотреть на сайте gnu, в соответствующем разделе.

Для начала нужно запустить эмуляцию с интересующей платформой. Я решил съэмулировать Cortex-A9.

После нескольких неудачных попыток наткнулся на этот how2, который оказался вполне вменяемым, на мой взгляд.

Ну сперва, само собою, нужно заиметь QEMU. Установил я его из стандартных репов Fedor’ы.

Далее создаём образ жёсткого диска, на который будет установлен Debian.

Читайте также:  Bash скрипты linux примеры

По этой ссылке скачал vmlinuz и initrd и запустил их в эмуляции.

Далее просто устанавливаем Debian на наш образ жёсткого диска (у меня ушло

После установки нужно вынуть из образа жёсткого диска vmlinuz и initrd. Делал я это по описанию отсюда.

Сперва узнаём смещение, где расположен раздел с нужными нам файлами:

Теперь по этому смещению примонтируем нужный нам раздел.

Копируем файлы vmlinuz и initrd и размонтируем жёсткий диск.

Теперь можно запустить эмуляцию.

И вот заветное приглашение:

Теперь с хоста по SSH можно подцепиться к симуляции.

Теперь можно и собрать программку. По Makefile’у ясно, что будет калькулятор. Простенький.

Собираем на хосте исполняемый файл.

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

Копируем исполняемый файл на таргет и проверяем.

Собственно, вот такая она, эта кросскомпиляция.

UPD: Подправил информацию по toolchain’ам по комментарию grossws.

Источник

gcc-linaro-arm-linux-gnueabihf собирает нерабочие ядра

Пытался собрать ядро для odroid-u2 с помощью gcc-linaro-arm-linux-gnueabihf-4.8-2013.06_linux, всё замирает после этого:

Отчего оно дальше не грузится?

Кстати, как вычисляется эта магическая цифра 40008000?

В то же время арчевый x-tools7h без проблем всё собрал.

cast AiFiLTr0

Перемещено JB из admin

Не пользуйся ты прекомпиленными тулчейнами всяких гарри поттеров и линары. Шлак же. man crosstool-ng

Далее, емнип в убуте на exynos поломана загрузка uImage, работает только zImage.
Далее, 40008000 это физический адрес в хексе, куда он положит вычитанный файл с карты. Определяется он картой памяти SoC’а, по этому адресу должна быть оперативная память из которой проц может исполнять код.

Это ты зря, у Linaro самые адекватные тулчейны для ARM.

Определяется он картой памяти SoC’а

Спасибо, это важно для меня. Значит цифра всегда одна и та же для всех ядер?

Мой конфиг для аллвиннера.

магическая цифра вычисляется на основе спецификаций на железку. Видимо, адресация начинается с 40000000. Сначала лежит загрузчик (видимо, u-boot), дальше – ядро, потом – КФС.

Сразу скажу, что эту железку я не ковырял, но процесс сборки похож на правильный.

В той плате, которую я ковырял, ядро надо было заливать по ftp. Так вот, когда заливали из-под оффтопика, загрузка останавливалась как-раз на “uncompressing linux. ” Там была какая-то ошибка с crc. А если заливали из-под Linux, то все работало.

Это я к тому, что надо убедиться, что ядро точно правильно загрузилось на плату

надо убедиться, что ядро точно правильно загрузилось на плату

я гружу рабочее ядро и делаю scp в /boot (fat32) . Поэтому я уверен что оно там лежит правильно.

Источник

Linaro Releases

Name Last modified Size License
Parent Directory
aarch64-elf
aarch64-linux-gnu
aarch64_be-elf
aarch64_be-linux-gnu
arm-eabi
arm-linux-gnueabi
arm-linux-gnueabihf
armeb-eabi
armeb-linux-gnueabi
armeb-linux-gnueabihf
armv8l-linux-gnueabihf

Linaro Stable Binary Toolchain Release GCC 5.2-2015.11-1

The Linaro Toolchain Working Group is pleased to announce the availability of the Linaro Stable Binary Toolchain GCC 5.2-2015.11-1 Release Archives.

These archives provide cross-toolchain executables (compiler, debugger, linker, etc.) and shared libraries (libstdc++, libc, etc.) that target ARM or Aarch64 GNU /Linux and bare-metal environments. The cross-toolchain binaries execute on a Linux or MS Windows (under mingw32) host operating-system.

Beginning with the Linaro 4.9-2014.11 release, Linaro has changed the layout and structure of its prebuilt toolchain binary release archives. The Linaro 4.9-2014.11 release is the first release built with ABE . ABE provides a maintainable and flexible toolchain building, benchmarking, validation, and release framework. For further details on ABE , please visit https://wiki.linaro.org/ABE.

The folders above describe the ARM and Aarch64 target triplets, i.e., the system on which you want your programs/applications to run. For more details on triplets, please click here.

Each folder contains a manifest.txt file further describing the target and host systems meant for the toolchain and the toolchain component source versions.

Supported Targets

Linaro binary toolchains are provided for the following ARM and Aarch64 targets:

aarch64-linux-gnu

Toolchains for little-endian, 64-bit ARMv8 for GNU /Linux systems

  • gcc-linaro-*x86_64_aarch64-linux-gnu.tar.xz
    • Linux 64-bit binaries for the Aarch64 Linux cross-toolchain
  • gcc-linaro-*i686-mingw32_aarch64-linux-gnu.tar.xz
    • Windows 32-bit binaries for the Aarch64 Linux cross-toolchain

armv8l-linux-gnueabihf

Toolchains for little-endian, 32-bit ARMv8 for GNU /Linux systems

  • gcc-linaro-*-x86_64_armv8l-linux-gnueabihf.tar.xz
    • Linux 64-bit binaries for the Aarch64 Linux cross-toolchain
  • gcc-linaro-*-i686-mingw32_armv8l-linux-gnueabihf.tar.xz
    • Windows 32-bit binaries for the Aarch64 Linux cross-toolchain

aarch64-none-elf

Toolchains for little-endian, 64-bit ARMv8 for bare-metal systems

  • gcc-linaro-*x86_64_aarch64-elf.tar.xz
    • Linux 64-bit binaries for the Aarch64 bare-metal cross-toolchain
  • gcc-linaro-*i686-mingw32_aarch64-elf.tar.xz
    • Windows 32-bit binaries for the Aarch64 bare-metal cross-toolchain

aarch64_be-linux-gnu

Toolchains for big-endian, 64-bit ARMv8 for GNU /Linux systems

  • gcc-linaro-*x86_64_aarch64_be-linux-gnu.tar.xz
    • Linux 64-bit binaries for the Aarch64 Linux Big Endian cross-toolchain
  • gcc-linaro-*i686-mingw32_aarch64_be-linux-gnu.tar.xz
    • Windows 32-bit binaries for the Aarch64 Linux Big Endian cross-toolchain

aarch64_be-none-elf

Toolchains for big-endian, 64-bit ARMv8 for bare-metal systems

  • gcc-linaro-*x86_64_aarch64_be-elf.tar.xz
    • Linux 64-bit binaries for the Aarch64 bare-metal Big Endian cross-toolchain
  • gcc-linaro-*i686-mingw32_aarch64_be-elf.tar.xz
    • Windows 32-bit binaries for the Aarch64 bare-metal Big Endian cross-toolchain

arm-linux-gnueabi

Toolchains for little-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU /Linux systems

  • gcc-linaro-*x86_64_arm-linux-gnueabi.tar.xz
    • Linux 64-bit binaries for the ARMv7 Linux soft float cross-toolchain
  • gcc-linaro-*i686-mingw32_arm-linux-gnueabi.tar.xz
    • Windows 32-bit binaries for the ARMv7 Linux soft float cross-toolchain

arm-linux-gnueabihf

Toolchains for little-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU /Linux systems

  • gcc-linaro-*x86_arm-linux-gnueabihf.tar.xz
    • Linux 32-bit binaries for the ARMv7 Linux hard float cross-toolchain
  • gcc-linaro-*x86_64_arm-linux-gnueabihf.tar.xz
    • Linux 64-bit binaries for the ARMv7 Linux hard float cross-toolchain
  • gcc-linaro-*i686-mingw32_arm-linux-gnueabihf.tar.xz
    • Windows 32-bit binaries for the ARMv7 Linux hard float cross-toolchain

arm-none-eabi

Toolchains for little-endian, soft-float, 32-bit ARMv7 (and earlier) for bare-metal systems

  • gcc-linaro-*x86_64_arm-eabi.tar.xz
    • Linux 64-bit binaries for the ARMv7 bare-metal cross-toolchain
  • gcc-linaro-*i686-mingw32_arm-eabi.tar.xz
    • Windows 32-bit binaries for the ARMv7 bare-metal cross-toolchain

armeb-linux-gnueabihf

Toolchains for big-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU /Linux systems

  • gcc-linaro-*x86_64_armeb-linux-gnueabihf.tar.xz
    • Linux 64-bit binaries for the ARMv7 Linux Big Endian hard float cross-toolchain
  • gcc-linaro-*i686-mingw32_armeb-linux-gnueabihf.tar.xz
    • Windows 32-bit binaries for the ARMv7 Linux Big Endian hard float cross-toolchain

armeb-none-eabi

Toolchains for big-endian, soft-float, 32-bit ARMv7 (and earlier) for bare-metal systems

  • gcc-linaro-*x86_64_armeb-eabi.tar.xz
    • Linux 64-bit binaries for the ARMv7 bare-metal Big Endian cross-toolchain
  • gcc-linaro-*i686-mingw32_armeb-eabi.tar.xz
    • Windows 32-bit binaries for the ARMv7 bare-metal Big Endian cross-toolchain

GCC 5.2 2015.11-1

The Linaro GCC 5.2 2015.11-1 binary toolchain release is built from the Linaro GCC -5.2-2015.11-1 release source archive. The Linaro GCC -5.2-2015.11-1 release source archive is derived from the same sources as the Linaro GCC -5.2-2015.10 snapshot source archive.

This release includes fixes for the issues specified in the Linaro GCC 5.2 2015.11-1-rc1 release-candidate.

GCC 5.2 2015.11-1-rc1

The Linaro GCC 5.2 2015.11-1-rc1 binary toolchain release-candidate is built from the Linaro GCC -5.2-2015.11-1-rc1 release-candidate source archive. The Linaro GCC -5.2-2015.11-1-rc1 release-candidate source archive is derived from the same sources as the Linaro GCC -5.2-2015.10 snapshot source archive.

This release-candidate includes fixes for the following issues:

  • The arm-eabi-none multi-libs are now available in the toolchain sysroot as a fix for Linaro bug 1920 and Linaro bug 1922.
  • Linaro glibc 2.21 now provides ld-linux-aarch64_be.so.1.
  • Linux 32-bit host binaries for the ARMv7 Linux hard float cross-toolchain (arm-linux-gnueabihf triple).

GCC 5.2 2015.11

The Linaro GCC 5.2 2015.11 binary toolchain release is built from the Linaro GCC -5.2-2015.11 release source archive. The Linaro GCC -5.2-2015.11 release source archive is derived from the same sources as the Linaro GCC -5.2-2015.10 snapshot source archive.

GCC 5.2 2015.11-rc1

The Linaro GCC 5.2 2015.11-rc1 binary toolchain release-candidate is built from the Linaro GCC -5.2-2015.11 release-candidate source archive. The Linaro GCC -5.2-2015.11-rc1 release-candidate source archive is derived from the same sources as the Linaro GCC -5.2-2015.10 snapshot source archive.

NOTES

  • The toolchain component source release archives for the individual components are at http://releases.linaro.org/components/toolchain/. Select the component (e.g. gcc, glibc, binutils, gdb) as available. If the component isn’t available then it means that a git repository tag or branch was used for the binary toolchain build. Please refer to the manifest files for complete information on the components used to build this toolchain.
  • The binary tarball has been split into 3 parts. As a result, you can install only the parts needed:
    • gcc-linaro-*.tar.xz – the compiler and tools
    • runtime-linaro-*.tar.xz – runtime libraries needed on the target
    • sysroot-linaro-*.tar.xz – sysroot (a set of libraries and headers to develop against)
  • Presently, only the bare-metal toolchains are multilib enabled. There is a plan to enable multilib for arm-linux toolchains in the near future.
  • Beginning 2014.11, sysroots will provide newer glibc versions (as chose by Linaro engineers) in order that users get the latest features and optimizations in the system libraries.
  • Eglibc 2.15 compatible sysroots will no longer be released. Users that require Eglibc 2.15 sysroots that need the latest Linaro GCC compiler should use a previous quarterly released sysroot of the required version.
  • With the exception of the arm-linux-gnueabihf targetted toolchain, the x86 (32-bit) Linux host toolchains are no longer provided. x86_64 (64-bit) Linux host toolchains are provided instead. This is because using LTO requires a 64-bit host toolchain.
  • The arm-linux-gnueabihf targeted toolchain no longer supports soft-float. The arm-linux-gnueabi targeted toolchain should be used for this purpose.

Feedback and Support

Subscribe to the important Linaro mailing lists and join our IRC channels to stay on top of Linaro development.

  • Linaro Bugzilla bug tracker for Linaro Linux Binary Toolchains
  • Linaro Toolchain Development mailing list
  • Linaro Toolchain IRC channel on irc.freenode.net at #linaro-tcwg
  • Questions? ask Linaro.
  • Interested in commercial support? inquire at Linaro support

Источник

Adblock
detector