我正在尝试将程序编译为armv6,但是即使我使用-march=armv6
选项,ELF文件也是为armv7构建的。所有.o
文件都已编译为armv6,只有ELF文件错误。
基本上我是这样编译的:
arm-linux-gnueabihf-g++ -static -march=armv6 -mfpu=vfp -mfloat-abi=hard -marm -Wa,-march=armv6 -o "Bridge"
检查所有.o
个文件,我得到了:
$ readelf -a -W Bridge.o | grep Tag
Tag_CPU_name: "6"
Tag_CPU_arch: v6
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_FP_arch: VFPv2
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_VFP_args: VFP registers
Tag_ABI_optimization_goals: Aggressive Speed
Tag_CPU_unaligned_access: v6
但是请检查ELF文件:
$ readelf -a -W Bridge | grep Tag
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3
Tag_Advanced_SIMD_arch: NEONv1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_rounding: Needed
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_VFP_args: VFP registers
Tag_CPU_unaligned_access: v6
我正在使用Linaro GCC 7.2.1,并且我也尝试使用旧版本和不同的编译标志组合。有人可以告诉我如何编译armv6 ELF文件吗?
答案 0 :(得分:1)
发现问题。 Linaro工具链二进制文件能够为armv6平台编译目标文件,但是,链接程序实际上并未解释该标志。
原因:工具链是使用armv7配置编译的。
解决方案:我下载了Linaro工具链的源代码,将其配置为支持armv6,并使用cross-ng-tool对其进行了编译。