Gcc ELF文件是在armv7中生成的,在armv6中是.o文件,而使用-march=armv6时,为什么?

Gcc ELF文件是在armv7中生成的,在armv6中是.o文件,而使用-march=armv6时,为什么?,gcc,arm,g++,cross-compiling,armv6,Gcc,Arm,G++,Cross Compiling,Armv6,我试图将我的程序编译为armv6,但ELF文件是为armv7构建的,即使我使用-march=armv6选项。所有.o文件都已编译到armv6,只有ELF文件错误 基本上我是这样编译的: arm-linux-gnueabihf-g++-static-march=armv6-mfpu=vfp-mfloat-abi=hard-marm-Wa,-march=armv6-o“桥” 检查所有.o文件,我得到以下信息: $readelf-a-W Bridge.o| grep标记 标记CPU名称:“6” Tag

我试图将我的程序编译为armv6,但ELF文件是为armv7构建的,即使我使用
-march=armv6
选项。所有
.o
文件都已编译到armv6,只有ELF文件错误

基本上我是这样编译的:

arm-linux-gnueabihf-g++-static-march=armv6-mfpu=vfp-mfloat-abi=hard-marm-Wa,-march=armv6-o“桥”

检查所有
.o
文件,我得到以下信息:

$readelf-a-W Bridge.o| grep标记
标记CPU名称:“6”
Tag_CPU_arch:v6
Tag_ARM_ISA_用途:是
Tag_THUMB_ISA_用法:THUMB-1
标签FP拱门:VFPv2
标签编号:4
Tag_ABI_FP_非规范:需要
Tag_ABI_FP_异常:需要
标签号:IEEE 754
需要标记ABI对齐:8字节
保留标记ABI对齐:8字节,叶SP除外
Tag_ABI_enum_大小:int
Tag_ABI_VFP_参数:VFP寄存器
Tag_ABI_优化目标:积极的速度
标记\u CPU\u未对齐\u访问:v6

但是检查ELF文件:

$readelf-a-W桥| grep标签
标记CPU名称:“7-A”
标签:v7
Tag\u CPU\u arch\u配置文件:应用程序
Tag_ARM_ISA_用途:是
Tag_THUMB_ISA_用法:THUMB-2
标签FP拱门:VFPv3
Tag_Advanced_SIMD_arch:NEONv1
标签编号:4
Tag_ABI_FP_取整:需要
Tag_ABI_FP_非规范:需要
Tag_ABI_FP_异常:需要
标签号:IEEE 754
需要标记ABI对齐:8字节
保留标记ABI对齐:8字节,叶SP除外
Tag_ABI_enum_大小:int
Tag_ABI_VFP_参数:VFP寄存器
标记\u CPU\u未对齐\u访问:v6

我使用的是Linaro GCC 7.2.1,我还尝试了旧版本和不同的编译标志组合。有人能告诉我如何编译armv6 ELF文件吗?

发现了问题。 Linaro工具链二进制文件能够为armv6平台编译对象文件,但是,链接器实际上没有解释这个标志

原因:该工具链是使用armv7配置编译的


解决方案:我下载了Linaro工具链的源代码,将其配置为支持armv6,并使用cross ng工具对其进行编译。

编译器调用链接器,您可能需要发送显式链接器命令。和/或分别使用链接器而不是编译器进行链接。您还可以做一些事情来查看传递给链接器的内容。在试图让编译器向链接器发送正确的标志之前,我会先尝试直接使用链接器并指定架构。我有一个自构建的源代码8.x.x,除非另有规定,否则它默认为体系结构4T,当我在编译器上指定armv6并让它调用链接器时,我得到了armv6。在使用gcc的基于arm的系统上,直接不交叉编译默认为armv7,但当我在命令行上指定armv6并允许编译器调用链接器时,我会得到最终二进制文件中的armv6。