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

标签 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

我做错了什么?

最佳答案

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

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

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

关于c++ - GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55465118/

相关文章:

python - 如何使用 mosquitto 发送图像?

c++ - 将引用定义为函数调用 - 有什么好处?

c++ - gcc 错误错误的 ELF 类 : ELFCLASS64, 尽管有 -m64 标志

linux - 从外部 IP SSHing 到 Raspberry Pi 的问题

Gcc内联汇编: what's wrong with the dynamic allocated register `r` in input operand?

c++ - 在 C++ 中使用用户定义的类型作为映射值

java - 为嵌入式流媒体设备选择 JVM

c++ - 寻找中位数的 Ceil 函数

javascript - 带有 GYP "exceptions"的 Node.js 附加组件

c++ - 用于空 Win32 项目的智能感知