【发布时间】:2018-07-16 18:42:33
【问题描述】:
我正在尝试将我的程序编译为 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 文件?
【问题讨论】:
-
编译器调用链接器,也许您需要发送显式链接器命令。和/或使用链接器而不是编译器单独链接。您还可以做一些事情来查看传递给链接器的内容。在尝试让编译器向链接器发送正确的标志之前,我会先尝试直接使用链接器并指定体系结构。
-
我还没有看到。我有一个自建的源代码 8.x.x,除非另有说明,否则它默认为架构 4T,当我在编译器上指定 armv6 并让它调用链接器时,我得到 armv6。在使用 gcc 的基于 arm 的系统上,直接不交叉编译它默认为 armv7,但是当我在命令行上指定 armv6 并允许编译器调用链接器时,我在最终二进制文件中得到 armv6。
标签: gcc arm g++ cross-compiling armv6