Кросс-компиляция для малины Pi в GCC. Когда начать?
===================================================

>    **TL/DR**. Где я могу найти дополнительную информацию о создании кросс-компиляции GCC 4.7.0 для платформы ARM (gnueabi) (предназначенной для работы на устройстве Raspberry Pi)?
> 
> 
> 

У меня только что появилась новая малина Pi, и я очень хочу начать программирование. Мне удалось установить инструментарий GCC (я использую образ системы Arch Linux) и скомпилировал некоторые базовые программы, все работают нормально.

Я также пытался скомпилировать библиотеки Boost, потому что часто использовал их в своих проектах, и все, казалось, работало нормально, следуя инструкциям (`./bootstrap.sh` + `./b2`), за исключением того факта, что компиляция была болезненно медленной, Я оставил его на несколько часов, но он едва прошел первые несколько исходных файлов. После того, как я оставил его на ночь, я обнаружил, что процесс сборки прерван из-за нехватки ОЗУ.

Итак, я предполагаю, что Rasp Pi просто недостаточно для компиляции чего-то такого размера, как Boost. Итак, кросс-компиляция приходит мне на ум. Однако, несмотря на то, что в Интернете имеется много информации о кросс-компиляции ARM, я нахожу ее запутанной. Где можно даже начать?

У меня есть недавняя версия GCC (4.7.0), доступная на моем малине Pi, поэтому я бы идеально хотел перекрестно скомпилировать ее с той же версией. Где я могу получить GCC 4.7.0 toolchain для ARM? (Я буду компилировать на x86 CentOS 6.2)

  **Edit:**

Я освободил ненужную память GPU и установил раздел подкачки на 4 ГБ на USB-накопителе, в то время как файлы сборки находятся на общем ресурсе NFS. Boost теперь компилируется намного быстрее, поэтому он управляемый. Я все еще хотел бы знать, как я могу настроить инструментальную комбинацию GCC 4.7 для кросс-компиляции на моем компьютере x86, хотя, поскольку я намереваюсь много компилировать, и я хотел бы, чтобы это было как можно быстрее.

  **Изменить 2:**

Так как GCC 4.7.0 является относительно новым, похоже, что нет встроенного кросс-компилятора (i386- > ARM). Вероятно, мне придется построить один сам, что кажется нетривиальной задачей (я пробовал и проваливал). Кто-нибудь знает, какой учебник следует для создания кросс-компилятора GCC, надеюсь, для одной из последних версий?

Я пробовал с [эту отличную оболочку script](http://joelinoff.com/blog/?p=658) (которая отлично работала для создания компилятора с одинаковой архитектурой), и я успешно построенных `binutils` и предпосылок GCC, но затем сборка GCC не сработала со многими загадочными ошибками. Я действительно потерялся здесь, поэтому я был бы очень признателен за вашу помощь.

GCC на малине Pi был настроен с помощью

```
--prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-bugurl=https://bugs.archlinux.org/ 
--enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-shared 
--enable-threads=posix --with-system-zlib --enable-__cxa_atexit 
--disable-libunwind-exceptions --enable-clocale=gnu 
--disable-libstdcxx-pch --enable-libstdcxx-time 
--enable-gnu-unique-object --enable-linker-build-id --with-ppl 
--enable-cloog-backend=isl --enable-lto --enable-gold 
--enable-ld=default --enable-plugin --with-plugin-ld=ld.gold 
--with-linker-hash-style=gnu --disable-multilib --disable-libssp 
--disable-build-with-cxx --disable-build-poststage1-with-cxx 
--enable-checking=release --host=arm-unknown-linux-gnueabi 
--build=arm-unknown-linux-gnueabi 

```

  **Изменить 3:**

Мне удалось создать 4.7 GCC toolchain для ARM (yay!), используя [эту оболочку script](http://github.com/dwelch67/raspberrypi), как было предложено пользователем dwelch в комментариях, Я также построил `newlib` и `libstdc++`, используя [эту статью](http://wiki.osdev.org/OS_Specific_Toolchain) в качестве руководства. Инструментарий отлично работает, но я запустил исполняемый файл на моей малине Pi, он терпит неудачу с `Illegal instruction`. Что может быть причиной этого?

 

Я нашел эти инструкции [Как построить кросс-компилятор для вашей малины Pi](http://www.bootc.net/archives/2012/05/26/how-to-build-a-cross-compiler-for-your-raspberry-pi/). Это отличная прогулка с помощью инструмента `crosstool-ng`, который упрощает настройку сборки кросс-компилятора A LOT (имеет хороший интерфейс на основе проклятий) и поддерживает GCC 4.7.

 .i1a { width: 336px; height: 280px; }
 @media(min-width: 768px) { .i1a { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .i1a { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .i1a { width: 728px; height: 90px; } }

 (adsbygoogle = window.adsbygoogle || []).push({});

Кажется, отлично работает!

 

 <http://github.com/dwelch67/raspberrypi> [каталог buildgcc](https://github.com/dwelch67/raspberrypi/tree/master/buildgcc) существует script для обоих 4.7 gcc/gnu и 3.0 clang/llvm. gnu, полученный из script в проекте mpx в opencores, я вырезал gdb и libgcc, glibc и т.д., уложил его в компилятор. если вы хотите, чтобы другой материал вырезал и вставлял руку для мип.

 .i2a { width: 336px; height: 280px; }
 @media(min-width: 768px) { .i2a { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .i2a { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .i2a { width: 728px; height: 90px; } }

 (adsbygoogle = window.adsbygoogle || []).push({});



Вот пошаговое руководство [Как построить кросс-компилятор Raspberry Pi в Windows](http://www.gurucoding.com/en/rpi_cross_compiler/index.php). Причина, по которой вы получаете ошибку `Illegal Instruction`, - это последний Raspbian с поддержкой hardfp и требует соответствующих исправлений для gcc и eglibc для поддержки hardfp. В противном случае сгенерированный код будет использовать разные аргументы ABI, т.е. Функции передачи в разных регистрах, поэтому сбой во время выполнения.

Также неверно сконфигурировать GCC для ARMv7 (Raspebby Pi - ARMv6) может привести к ошибке `Illegal Instruction`. Обязательно укажите опцию `--with-arch=armv6` при настройке GCC.

Однако приведенное выше руководство основано на GCC 4.6.3. Но я думаю, что он также должен работать с GCC 4.7.

 

Я не мог найти 4,7 gcc, только 4.6. Для получения информации я скомпилировал ядро Pi на довольно старой машине Ubuntu (1 ГГц, 768 МБ ОЗУ) в соответствии с рекомендациями на этой странице:
[Компиляция ядра](http://elinux.org/Rpi_kernel_compilation#Ubuntu_Linux)

Сборка заняла около 90 минут, по сравнению с 6 часами предлагается, чтобы она заняла Pi. Ядро отлично работает на Pi. Возможно, вы можете адаптировать эти рекомендации для кросс-компиляции других проектов на вашей машине x86 Linux.

 

Вы можете попробовать toolchain по адресу: <https://github.com/kallaballa/Raspberry-GCC-4.7.3>

Это готовая gcc-4.7.3 toolchain для armv6 с hardfp с использованием gnueabi. Я использую его, чтобы перекрестно скомпилировать С++ 11 для целевой задачи raspberrian.

Обратите внимание, что он работает только с хостами Linux x86\_64.

 

Проект [dockcross](https://github.com/dockcross/dockcross) является отличной отправной точкой для полностью дезодорированной инструментальной цепочки, вы можете построить не только для Pi, но и для чего-либо еще. Вот команды:

```
docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7
chmod +x ./dockcross-linux-armv7
./dockcross-linux-armv7 bash -c '$CC test/C/hello.c -o hello_arm'

```

Он имеет встроенный `cmake`.

 

Как вы уже отметили, построение на малине Pi очень медленное, но надежное (поскольку оно не перекрестно компилируется), если вы не исчерпали память. Возможно, можно настроить параметры памяти и свопа, чтобы сделать большие сборки возможными (если не быстро). Я знаю, что на форумах люди говорят о том, чтобы помещать корневые разделы на SD, пользовательские разделы на USB-накопители, и, конечно же, это может повлиять на быструю (класс 6 или лучше) SD-карту. Возможно, со временем эффективность компиляции улучшится по мере улучшения программного обеспечения. Или, может быть, у малины Pi 2 будет улучшенный чипсет и больше оперативной памяти.: -)