【问题标题】:GCC 8 Cross Compiler outputs ARMv7 executable instead of ARMv6GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6
【发布时间】:2019-08-23 05:01:50
【问题描述】:

我正在尝试使用 GCC 8.2.1 为 Raspberry Pi Zero 编译 C++ 应用程序。
我将它用于使用 CMake 构建的一个相对较大的 C++17 项目,我正在尝试在我的 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

我做错了什么?

【问题讨论】:

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


【解决方案1】:

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

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

生成的可执行文件的架构现在是正确的,但我还不能在目标上测试它以检查它是否真的运行。

【讨论】:

  • 执行时:make ARCH=arm INSTALL_HDR_PATH=/opt/cross-pi-gcc/arm-linux-gnueabihf headers_install 我得到了:/bin/sh: 1: rsync: not found Makefile:1212:目标“headers_install”的配方失败制作:*** [headers_install] 错误 127 请告知
  • uname -a Linux 50cf6719eda5 5.9.8-050908-generic #202011101634 SMP Wed Nov 11 00:51:04 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
  • @M.Hefny 听起来你没有安装 rsync。我不再使用这种方式,我使用 crosstool-ng,你可以在 GitHub 上找到我所有的构建脚本:github.com/tttapa/RPi-Cpp-Toolchain
  • 是的,非常感谢....我不得不运行 apt install rsync 问候
【解决方案2】:

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

这里提到了这个信息https://github.com/Pro/raspi-toolchain

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多