Raspberry linux ���������� gcc

Кросс-компилятор для Raspberry Pi4

Хочу рассказать, как я собрал себе кросс-компилятор для Raspberry Pi4 с помощью crosstool-ng. Возможно кому-то тема покажется слишком примитивной и скучной. Я и сам поначалу думал, что быстро смогу собрать кросс-компилятор, но пришлось повозиться и изучать вопрос, некоторые нюансы были для меня неожиданны. Дальше расскажу что и как я делал.

Пожалуй первый вопрос, который нужно себе задать: «Для чего нужен кросс-компилятор?» В самом деле, Raspberry Pi4 довольно быстр и компилировать программы можно прямо на нем. Если проект простой, то вполне можно так и делать. Но когда проект разрастается и усложняется, то тут уже лучше переходить на кросс-компиляцию. Тогда и другие вопросы проще решить, например, можно организовать авто сборку проекта на интеграционном сервере. При кросс-компиляции на быстром ПК можно значительно поднять скорость сборки, да и средства редактирования программ на ПК можно найти лучше.

Второй вопрос: «Может взять уже готовый кросс-компилятор? Зачем свой-то собирать?» Сказать по правде я не нашел нормального кросс-компилятора для Raspberry. Может я плохо искал? На github от распберри есть проект tools и там есть несколько кросс-компиляторов, но они же древние! Ну что там? Версия 4.9.3? Как-то не серьезно. На странице загрузки Linaro я вижу только версию 7.5, уже получше, но, во-первых, на самом Raspberry Buster OS уже версия 8.3, а во-вторых, компилятор Linaro у меня заработал только после некоторых патчей. Как-то странно…

Именно после попыток запустить компилятор Linaro я подумал, что наверное смогу сам собрать свой собственный кросс-компилятор. Некоторый опыт работы с crosstool-ng у меня уже был. Я делал кросс-компилятор для системы на кристалле Amber.

В чем сложность сборки? У инструмента crosstool-ng есть множество различных настроек, которые не всегда понятны. Сборка кросс-компилятора на моем ноутбуке занимает примерно 45 минут. Если с настройками ошибся, то полученный кросс-компилятор как-то не так работает, что-то не собирает, или собирает, но полученный бинарник не запускается на Raspberry. После проверки полученного кросс-компилятора мне приходилось опять что-то изменять в настройках и опять генерировать его сначала. Ну я сделал несколько попыток, пока не получилось так как я хотел.

Пожалуй главное, чего я не очень понимал сначала — компилятор должен соответствовать операционной системе. Это выглядит несколько странно, но это так получается. В самом деле, в ОС уже содержатся стандартные библиотеки c/c++. Они экспортируют набор функций. Код, генерируемый кросс-компилятором, должен содержать вызовы этих библиотечных функций. Поэтому версии библиотек в самом кросс-компиляторе и в ОС для которой будет генерироваться код должны совпадать.

Попробуем создать кросс-компилятор.

Порядок действий будет такой:

1) Проверить, что в нашей хост системе (я пользуюсь Ubuntu 18) установлены следующие пакеты:

Если чего-то нет, то нужно установить через sudo apt install.

2) Скачиваем crosstool-ng версии 1.24.0 с их сайта:

3) Распаковываем полученный архив:

4) Собираем crosstool-ng:

5) Патчим crosstool-ng

Это довольно странное действие, но без него у меня не получалось хорошего результата. Без этого патча кросс-компилятор отказывался по умолчанию искать библиотеки в папке /usr/lib/arm-linux-gnueabihf относительно sysroot.

Патч нужно получить на самом распберри.

На распберри пи4 с установленной OS Buster (это важно, я делаю кросс-компилятор именно для этой ОС) нужно взять исходники binutils:

и посмотреть файл /usr/src/binutils/patches/129_multiarch_libpath.patch

Этот файл мы кладем в папку crosstool-ng-1.24.0/packages/binutils/2.31.1 на нашем хост компьютере. Это важно положить именно в эту папку, так как на самой Raspberry Pi OS Buster версия binutils 2.31.1. Проверьте это командой в консоли на распбери:

Кроме этого, нужно проверить, какая GLIB стоит в вашей OS на распбери:

У меня в Buster стоит 2.28 и значит и сам crosstool-ng нужно будет сконфигурировать в эту версию GLIB 2.28 там по умолчанию не такая версия. Если этого не сделать, то кросс-компилятор будет генерировать код, который не будет запускаться на Raspberry в Buster OS — бинарник может ссылаться на несуществующие функции во внешних библиотеках.

Читайте также:  Как запустить средство восстановления windows 10 с флешки

6) Подготовим начальную конфигурацию crosstool-ng

В самом crosstool-ng уже есть довольно много типовых конфигураций. В том числе, там есть очень похожая на то, что нам надо конфигурация для Raspberry Pi3.

Список всех возможных конфигураций можно посмотреть командой:

Потом выбранную конфигурацию нужно «активировать» командой:

Появится новый файл конфигурации .config, который полностью определяет свойства будущего кросс-компилятора. Теперь его нужно немного поправить. Можно редактировать и вручную, но легче исправлять из меню:

Выглядит самое первое меню вот так:

7) Дальше меняем странную опцию, возможно необязательную.

Практически везде где хоть что-то пишется о создании кросс-компилятора для Raspberry пишут убрать галочку с опции «Render the toolchain read-only». Эта настройка находится в меню «Paths and misc options». В документации к crosstool-ng написано, что по умолчанию итоговый компилятор будет доступен только для чтения, чтобы ненароком компилируемая программа не была установлена в sysroot самого компилятора. На мой взгляд это вполне разумное решение. Не знаю, для чего всякие авторы пишут убрать галочку отсюда…

8) Следующее. Заходим в пункт «Target options» и устанавливаем значения согласно скриншоту:

Нужно сказать, что вообще-то Raspberry Pi4 имеет процессор Cortex-A72 и это можно здесь в меню назначить. Однако, я себе оставил Cortex-A53 потому, что я буду компилировать не только для Pi4, но и для Pi3. Хотя, точную настройку можно будет задавать уже при запуске компилятора gcc с помощью параметра в командной строке -mcpu=cortex-a72

Хочу еще добавить, что я предпочитаю, чтобы кросс-компилятор имел точно такой же tuple, как и компилятор на самой плате Raspberry. То есть итоговый компилятор будет arm-linux-gueabihf и никак иначе. Мне так проще. Многие существующие пакеты имеют в своем составе готовые cmake файлы, где компилятор назначается именно arm-linux-gnueabihf. Мы же не хотим потом эти все cmake файлы исправлять вручную и писать там что-то вроде armv8-mygcc-linux-gnueabihf? Для этого я выключаю опцию «Omit vendor part of target tuple».

9) Заходим в меню «Binary utilities» и устанавливаем версию binutils 2.31.1 (Помните, что у нас еще патч именно для него?)

10) Заходим в меню «Operating system» и устанавливаем версию ядра 4.20

Вообще-то Raspberry Buster OS уже сейчас имеет ядро 5.10, но максимум, что можно поставить это только 4.20

11) Заходим в меню «C-libraries» и устанавливаем версию GLIB 2.28

12) Заходим в меню «C-compiler»

Устанавливаем желаемую версию будущего кросс-компилятора 8.3.0 и добавляем в настройки компилятора core gcc extra config опцию —enable-multiarch. Это важно, чтобы кросс-компилятор находил библиотеки в sysroot по пути /usr/lib/arm-linux-gnueabihf
Теперь выходим из всех меню, сохраняем сделанные изменения, когда спросит и приступаем к сборке.

13) Сборка выполняется простыми командами:

Придется подождать. У меня сборка на ноутбуке шла примерно 45 минут. После сборки ваш новый кросс-компилятор расположен в пути

Можно проверить какие пути к библиотекам по умолчанию будет использовать кросс-компилятор. Будет ли он искать в пути /usr/lib/arm-linux-gnueabihf?

Для этого запустим команду:

Команда должна выдать что-то такое:

Обратите внимание, что пути начинаются со знака «=». Это значит, что это пути относительно sysroot, если он будет указан при запуске gcc с опцией командной строки —sysroot=PATH_TO_YOUR_SYSROOT.

Вот пожалуй и все. Остается решить вопрос, где взять sysroot. Проще всего на Raspberry Pi установить все нужные девелоперские пакеты и потом, вытащив из устройства SD карту, переписать ее на хост ПК. Но там тоже есть некоторые нюансы.

Теперь, когда кросс-компилятор у нас есть мы можем собрать какую ни будь специфичную для распберри программу. Например, демонстрационные программы userland от самой Raspberry:

Результат компиляции будет в папке build/bin.

В завершении статьи я хотел бы привести таблицу дополнительных параметров для компиляторов gcc при сборке проектов под различные версии raspberry:

Надеюсь, что моя статья кому-то окажется полезной.

Источник

Solarian Programmer

My programming ramblings

Raspberry Pi — Install GCC 10 and compile C++17 programs

Posted on December 8, 2017 by Paul

Updated 10 May 2020

In this article I will show you how to install GCC 10 on your Raspberry Pi system and how to compile C++17 programs. At the time of this writing Raspbian is based on Debian Buster, which comes with the stable but slightly outdated GCC 8.3 as the default C and C++ compiler.

Читайте также:  Монитор безопасности astra linux

There is also a video version of this tutorial:

If you want to compile GCC 10 from sources check my article.

If you also want to install Clang on your Raspberry Pi, check my article.

First, make sure that your Raspbian is updated:

If you don’t have git on your Raspbian, you can install it with:

Let’s start the GCC installation process. Open a Terminal and download a binary of GCC 10:

Next, extract the archive, move the extracted compilers to /opt and remove the repository:

Next, we are going to add the new compilers to the path and create a few symbolic links:

At this point, you should be able to invoke the compilers with gcc-10.1, g++-10.1 or gfortran-10.1.

You can check if everything is properly setup by printing the version of the installed compiler:

This is what I see on my Pi:

If, at some point in the future, you’ll want to get rid of GCC 10 from your system, all you have to do is to remove the gcc-10.1.0 folder from /opt, example:

The above procedure will keep GCC 8.3 as the default C and C++ compiler for any package that depends on it. If you want to compile C programs you could use gcc-10.1 and for C++ g++-10.1.

Let’s try to compile and run a C++17 code that uses an if block with init-statement (the example is a bit silly, but it will show you how to compile C++17 programs):

Save the above code in a file named if_test.cpp and compile it with:

This is what I see on my Pi:

If you are interested to learn more about modern C++ I would recommend reading A Tour of C++ by Bjarne Stroustrup.

Источник

Raspberry linux ���������� gcc

Hi folks!
So the current version of GCC in the raspbian apt-get repository is 4.9.2 which has a rather nasty bug that affects ARM builds, and in particular the Pi: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70132
I have run in to this bug on a number of occasions now — and where I know I can fix the bug in most Makefiles to not use -mcpu=native or whatever it has become increasingly annoying when installing things from sources such as npm (using node-gyp) where it is a pain in the butt to edit make and build files. The bug has since been fixed in GCC 4.9.4.
Now I know I can manually build this version of GCC but it’s a time consuming hassle to do this, so it would be nice if GCC was updated in the raspbian repo. Is there anywhere I can officially request this?

Re: Update GCC in apt-get repository

Re: Update GCC in apt-get repository

Re: Update GCC in apt-get repository

It makes sense to to keep GCC up to date.

Except Raspbian is based on Debian. Debian is very careful about the stability of it’s operating system. That is «stability» as in not having updates break anything in the OS build or installation. As such it is slow in adopting new versions of anything.

As GCC is required for almost everything in the operating system understandably it does not get updated until it has been tested and determined not to break anything.

I’m curious. What packages from NPM have failed for you? I use node a lot and have yet to see such a problem.

Re: Update GCC in apt-get repository

There are instructions in that other thread for installing GCC 6.x on a Raspbian Jessie system (by temporarily changing the sources file) from the «stretch» repo. That seems like the most straightforward way to get going, although it does mean that you will have to tell your build process which GCC to use. I think you can do it by setting the CC environment variable; I.e., you should not need to edit the Makefile(s) to get it to use the new version.

Читайте также:  Настраиваем bios для установки windows

Alternatively, you could install Arch Linux Arm on another SD card, boot that, and use it to compile stuff. Arch always has the latest «bleeding edge» software installed.

Источник

How to install GCC and/or apt on embedded linux Raspberry Pi

I have a pre-configured linux distro on a raspberry pi (used for a bitcoin miner). The problem is that this distro is very minimal, only has busybox for basic commands. It doesn’t have a package manager and it doesn’t even have a gcc compiler. So my target is to install a gcc compiler on it so I can go further and install other software.

So I’m basically limited to these commands from busybox:

What I have tried so far is to download a new busybox from here which includes more commands, most notably rpm (still lacks dpkg though)

I have downloaded some gcc rpm’s from here http://rpmfind.net/linux/rpm2html/search.php?query=gcc&submit=Search+. &system=&arch= but for some reason gcc does not execute

Also tried installing apt-rpm to get apt-get, but it misses a shared libary

can someone help me on all this??

1 Answer 1

you’ve tagged this post as «yocto». So the only thing I can advice you is using this wonderful tool 🙂 you don’t want to compile your tools from your raspi, but from your killer linux machine 🙂

first, make sure you have all the prerequisists. for fedora:

for ubuntu / debian:

then, you can get yocto from git://git.yoctoproject.org/poky

then, you need to get the raspberrypi layer and its dependencies:

then, setup the build environment:

here rpi-build will be the name of the build directory, it can be whatever you want. this will setup all the environment variables needed to use yocto, andmove you to the newly create build directory.

edit conf/bblayers.conf and add the needed layers to BBLAYERS. it should look like something like this:

then, edit conf/local.conf set the MACHINE variabel to raspberrypi:

you can also tell yocto to generate deb files instead of the default rpms by changing:

in order to quickly have dpkg present in the build, just add the following line in your conf/local.conf

and create a basic image:

this will take some time. a LOT of time in fact (yocto will generate the whole rootfilesystem, it will download the sources and compile them, will create deb packages for each of them, and will generate a flashable s image).

during that time I suggest you read the yocto documentation in order to understand how to add more software to the resulting image and / or customise it. Explaining how yocto works can’t just be an answer in stackoverflow you’ll need to read the documentation and practice a little bit.

but the main thing to understand is that yocto provides receipes. Basically, a receipe describes how to get a packages and how to compile it. a simple example of receipe can be found in:

the good thing with yocto, is that you can easily add your own receipes. layers provide supersets of receipes, they also allow customisation. here, we added the raspberrypi layer in order to add support for the raspberry board. the raspberry layer provides all the receipes needed to configure the kernel, and the bootloader etc.

once compilation is done, in order to flash the resulting sd image just do:

where «sd?» is your (unmounted) sdcard (think about saving it if needed) plug back your sdcard to your raspi, boot it.

in order to find out the raspi ip, you can scan your network for open ssh ports:

next time you’ll need to build a new package, you can do:

and then just scp the resulting .deb file (from tmp/work/armv6-vfp-poky-linux-gnueabi/PACKAGE_NAME/PACKAGE_VERSION/deploy-debs/armv6-vfp/PACKAGE.ipk) to the raspi and use dpkg to install it. you can also create your own image based on rpi-basic-image and adding your own selection of packages.

Exmple with htop:

yocto will be very helpful to ease the cross compilation process for you.

Источник

Оцените статью