сборка для ARMv6 с gnueabihf
Я пытаюсь создать приложение для ARMv6, но не получается.
Я думаю, что проблема заключается в цепочке инструментов, которая поддерживает жесткий Float, но ARMv6 этого не делает.
Ну, сначала я установил-march=armv6, где компиляция завершается неудачей.
/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux/arm-linux-gnueabihf/libc/usr/include/bits/byteswap.h: In function ‘__bswap_32’:
/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux/arm-linux-gnueabihf/libc/usr/include/bits/byteswap.h:45:1: sorry, unimplemented: Thumb-1 hard-float VFP ABI
Кроме того, я устанавливаю-mfloat-abi=soft, которые заставляют Линкер жаловаться:
/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: error: prog uses VFP register arguments, prog.o does not
/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: failed to merge target specific data of file prog.o
Ну, как я на самом деле строю для ARMv6?
Или в цепочке инструментов есть ошибка?
2 ответов:
Ваш набор инструментов сконфигурирован для генерирования кода пальца по умолчанию. Проблема с этим заключается в том, что единственными кодировками большого пальца команд с плавающей запятой являются 32-битные Thumb-2, которые фактически существуют только на ARMv7 или более поздних версиях*, и уж точно не доступны на обычном ARMv6.
Для целевой архитектуры pre-v7 лучше всего компилировать с помощью
-marmдля генерации кода ARM вместо относительно ограниченного набора 16-битных инструкций Thumb.* я подозреваю, что большинство людей никогда сознательно не столкнутся с ARM1156.
Ядро ARM1176JZF-S , найденное в BCM2835 SoC (как используется в некоторых моделях Raspberry Pi), является ARMv6z, которое включает поддержку жесткого диска через VFPv2, поэтому это определенно допустимая конфигурация для таргетинга.
Проблема заключается в том, что сопровождающие Linaro toolchain определяют ARMv7A как минимально поддерживаемую архитектуру. Это делает кросс-компиляцию для Raspberry Pi с использованием пакетов кросс-компилятора Debian довольно безнадежной, так как различные встроенные модули потерпят неудачу, если вы правильно настроите ваша сборка для BCM2835 с
-march=armv6z -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hardЭто
gcc -vна Raspbian Stretch:$ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/6/lto-wrapper Target: arm-linux-gnueabihf Configured with: ../src/configure -v --with-pkgversion='Raspbian 6.3.0-18+rpi1+deb9u1' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=arm-linux-gnueabihf- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf Thread model: posix gcc version 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1+deb9u1)Сравните с
arm-linux-gnueabi-gcc-6 -vна Ubuntu 18.04:$ arm-linux-gnueabihf-gcc-6 -v Using built-in specs. COLLECT_GCC=arm-linux-gnueabihf-gcc-6 COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabihf/6/lto-wrapper Target: arm-linux-gnueabihf Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 6.4.0-17ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-as=/usr/bin/arm-linux-gnueabihf-as --with-ld=/usr/bin/arm-linux-gnueabihf-ld --program-suffix=-6 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-werror --enable-multilib --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --includedir=/usr/arm-linux-gnueabihf/include Thread model: posix gcc version 6.4.0 20180424 (Ubuntu/Linaro 6.4.0-17ubuntu1)И обратите внимание, что первый имеет
--with-arch=armv6 --with-fpu=vfp --with-float=hard, тогда как последний имеет--with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hardэтот пост в блоге предлагает одно решение (в основном с использованием Clang и самостоятельного построения binutils):
Comments