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

4
我试图将程序编译为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 "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文件吗?

编译器会调用链接器,也许你需要发送显式的链接器命令。或者使用链接器而不是编译器进行单独的链接。你还可以做一些事情来查看传递给链接器的内容。我建议先直接使用链接器并指定架构,然后再尝试让编译器向链接器发送正确的标志。 - old_timer
我还没有看到这个,我有一个从源代码构建的8.x.x自定义版本,它默认使用4T架构,除非另有规定。当我在编译器上指定armv6并让它调用链接器时,我得到了armv6。在基于ARM的系统上直接使用gcc编译时,默认为armv7,但是当我在命令行上指定armv6并允许编译器调用链接器时,最终二进制文件中会得到armv6。 - old_timer
1个回答

2

问题已确认。

Linaro工具链二进制文件能够编译armv6平台的目标文件,但链接器实际上没有解释该标志。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接