GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6 [英] GCC 8 Cross Compiler outputs ARMv7 executable instead of ARMv6

查看:67
本文介绍了GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 GCC 8.2.1.
我正在将它用于一个使用 CMake 构建的相对较大的 C++17 项目,并且我正在尝试在我的 x86-64 笔记本电脑上交叉编译它.

I'm trying to compile a C++ application for a Raspberry Pi Zero using GCC 8.2.1.
I'm using this for a relatively large C++17 project that is being built using CMake, and I'm trying to cross-compile it on my x86-64 laptop.

即使使用最简单的代码,我也无法为 ARMv6 编译它:

Even with the simplest code possible, I'm not able to compile it for ARMv6:

int main() {}

$ arm-linux-gnueabihf-g++ test.cpp -static -march=armv6 -mfpu=vfp -mfloat-abi=hard

在 Pi 上运行该文件时,我收到一个 Illegal instructions 错误,并且 readelf 返回以下内容:

When running the file on the Pi, I get an Illegal instruction error, and readelf returns the following:

$ 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 似乎忽略了我的架构标志.

GCC seems to ignore my architecture flags.

当简单地编译成目标文件时,它似乎工作得很好,但链接阶段总是使用ARMv7:

When simply compiling it into an object file, it seems to work just fine, but the linking stage always uses 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

我做错了什么?

推荐答案

默认情况下,较新的 GCC 版本不会为 ARMv6 创建正确的二进制文件.即使您将正确的 -mcpu= 标志传递给 gcc,它也会为较新的 ARMv7 架构创建启动代码.在您的 RasPI 零上运行它们将导致非法指令";例外.

By default, newer GCC versions do not create correct binaries for ARMv6. Even though you pass the correct -mcpu= flag to gcc, it will create startup code for the newer ARMv7 architecture. Running them on your RasPI Zero will cause an "Illegal Instruction" exception.

此处提到了此信息https://github.com/Pro/raspi-toolchain

这篇关于GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆