Gcc 使用gnueabihf为ARMv6构建

Gcc 使用gnueabihf为ARMv6构建,gcc,linker,arm,embedded,armv6,Gcc,Linker,Arm,Embedded,Armv6,我尝试为ARMv6构建一个应用程序,但失败了 我想问题在于支持硬浮动的工具链,但ARMv6不支持 首先,我设置了-march=armv6,其中编译失败 /opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_-linux/arm-linux-gnueabihf/libc/usr/include/bits/byteswap.h:在函数“u_-bswap_32”中: /opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03

我尝试为ARMv6构建一个应用程序,但失败了

我想问题在于支持硬浮动的工具链,但ARMv6不支持

首先,我设置了-march=armv6,其中编译失败

/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_-linux/arm-linux-gnueabihf/libc/usr/include/bits/byteswap.h:在函数“u_-bswap_32”中:
/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux/arm-linux-gnueabihf/libc/usr/include/bits/byteswap.h:45:1:抱歉,未实现:Thumb-1硬浮点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:错误:prog使用VFP寄存器参数,prog.o不使用
/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:未能合并文件prog.o的目标特定数据

那么,我实际上如何为ARMv6构建呢?
或者工具链中有bug吗?

默认情况下,您的工具链配置为发出拇指代码。问题在于,浮点指令的唯一Thumb编码是32位Thumb-2指令,无论出于何种目的,它只存在于ARMv7或更高版本*,在普通的ARMv6上肯定不可用

要针对v7之前的体系结构,最好使用
-marm
编译以生成ARM代码,而不是相对有限的16位Thumb指令集

*我怀疑大多数人永远不会故意遇到ARM1156。

BCM2835 SoC(在一些Raspberry Pi型号上使用)中的核心是ARMv6z架构,它包括通过VFPv2的硬浮动支持,因此这绝对是一个有效的目标配置

问题是Linaro工具链的维护者指定ARMv7A作为最低支持架构。这使得使用Debian交叉编译器包对Raspberry Pi进行交叉编译变得毫无希望,因为如果使用
-march=armv6z-mtune=arm1176jzf-s-mfpu=vfp-mfloat abi=hard

这是拉斯宾拉伸上的gcc-v:

$ 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) 
与Ubuntu 18.04上的
arm-linux-gnueabi-gcc-6-v相比:

$ 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)
请注意,前者具有
——带arch=armv6——带fpu=vfp——带float=hard
,而后者具有
——带arch=armv7-a——带fpu=vfpv3-d16——带float=hard

提供了一个解决方案(基本上是使用叮当声和自行构建binutils):

太好了,谢谢。作为对你文章的补充:除了使用-marm之外,我还使用了kick out-mfloat abi=soft。@b-boy这是一个gnueabihf工具链,所以是的,捆绑的库只会链接到硬浮动对象。它们可能也是Thumb-2,所以也不要静态链接;确实,您希望针对目标设备的系统根进行构建,而不是与工具链捆绑在一起的最小系统根,以避免令人不快的意外和/或微妙的不兼容。BCM2835 SoC中的ARM1176JZF-S内核(在某些Raspberry Pi型号上使用)是ARMv6z,它通过VFPv2提供硬浮动支持。您使用的是Linux吗?Linaro适用于Linux OS/glibc,除非使用
-ffreestanding
编译,否则您将遇到问题。我建议你使用,如果你真的嵌入。launchpad有多个用于不同主机的版本(包括Linux主机开发盒)。否则,您可能会使用“embedded linux”标记。我想知道如何使用arm linux gnueabihf为pi Zero编译raspberry pi linux内核,如这里所述:,自从@axk之后有什么变化吗?我也在绞尽脑汁。在我的Pi Zero上,我无法运行使用
crossbuild-essential-armhf
交叉编译的二进制文件,但由于一些未知的原因,我可以愉快地运行使用相同交叉工具链构建的内核。@itachi,原因是内核没有任何外部依赖项,通过常规的用户空间应用程序编译,您至少有glibc和加载程序。问题是,当你编译它时,它使用了一个armv7 glibc,这迫使你的应用程序被重新定位到armv7。诀窍是确保编译所针对的所有依赖项都具有正确的目标体系结构。@axk是的,我昨天一直坐到深夜,终于解决了这个问题。“问题”在连接阶段。当我使用所有标志(如
-march
-mcpu
等)交叉编译我的二进制文件而不链接时,然后对该二进制文件运行
readelf
,架构部分看起来与在RPi上编译的相同代码完全相同。但是,在链接之后,armv7的一切看起来都是这样。我假设唯一的解决方案是自己编译ARMGCC工具链,目标是armv6(至少对于较旧的PIE和Zero)。