GCC 8交叉编译器输出ARMv7可执行文件而不是ARMv6

时间:2019-04-01 23:58:41

标签: c++ gcc raspberry-pi arm cross-compiling

我正在尝试使用GCC 8.2.1为Raspberry Pi Zero编译C ++应用程序。
我正在将其用于一个相对较大的C ++ 17项目,该项目正在使用CMake构建,并且正在尝试在x86-64笔记本电脑上对其进行交叉编译。

即使使用最简单的代码,我也无法针对ARMv6进行编译:

int main() {}
$ arm-linux-gnueabihf-g++ test.cpp -static -march=armv6 -mfpu=vfp -mfloat-abi=hard

在Pi上运行文件时,出现Illegal instruction错误,readelf返回以下内容:

$ arm-linux-gnueabihf-readelf -A a.out
Attribute Section: aeabi
File Attributes
  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

GCC似乎忽略了我的体系结构标记。

当简单地将其编译为目标文件时,它似乎可以正常工作,但是链接阶段始终使用ARMv7:

$ arm-linux-gnueabihf-g++ test.cpp -static -march=armv6 -mfpu=vfp -mfloat-abi=hard -c
$ arm-linux-gnueabihf-readelf -A test.o
Attribute Section: aeabi
File Attributes
  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 Debug
  Tag_CPU_unaligned_access: v6

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

我最终按照this post从源代码编译了GCC。我不需要所有步骤(我使用GCC 8编译了所有内容,而不是先编译GCC 6.3,并且我没有编辑任何源文件。)

我在GitHub上发布了一个包含所有构建步骤的Dockerfile。

现在生成的可执行文件的体系结构是正确的,但是我无法在目标上对其进行测试以检查其是否真正运行。

答案 1 :(得分:0)

默认情况下,较新的GCC版本不会为ARMv6创建正确的二进制文件。即使您将正确的-mcpu =标志传递给gcc,它也会为较新的ARMv7体系结构创建启动代码。在您的RasPI Zero上运行它们会导致“非法指令”异常。

这里https://github.com/Pro/raspi-toolchain

提到了此信息