【问题标题】:How to compile for arm9 platform...which specific flags to use?如何为 arm9 平台编译...使用哪些特定标志?
【发布时间】:2017-02-02 05:11:42
【问题描述】:

如何验证是否为 ARM 9 或 ARM11 编译了可执行文件? 我编译的应用程序如下: - arm-linux-gnueabihf-gcc -march=armv4t -mfloat-abi=hard -mfpu=vfp -marm -Wall sample.c -o sample

示例是简单 Hello-world 的 C 程序。

这是objdump -f 的输出,

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-D16 
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_HardFP_use: SP and DP 
Tag_ABI_VFP_args: VFP registers 
Tag_ABI_optimization_goals: Aggressive Speed 
Tag_CPU_unaligned_access: v6

【问题讨论】:

  • 好像是 arm11 的...你能告诉我如何为 arm9 编译它吗?
  • en.wikipedia.org/wiki/List_of_ARM_microarchitectures。 arm9 是 armv4t。 arm11 是 armv6t。但是会整天执行 armv4t 指令。 fpa 在 arm7 天左右,而不是 vfp。根据该维基百科页面,vfp 出现在 arm10 天。因此,尽管信息很容易获得,但您的猜测是一致的,没有理由询问 stackoverflow。
  • 你如何为arm9编译好,你打算使用的arm9上是否有浮点单元?直到最近,它们还是相当罕见的,所以可能不是,几乎所有东西都运行 armv4t 指令拇指或手臂(当然不是 cortex-ms),所以没有理由改变它。你可以只用软浮点编译 armv4t,除了大部分代码是芯片特定的并且无论如何都不会运行,指令集至少会一直移植到家族树。
  • 更改命令行选项不会为不同的芯片(外围设备等)重写您的软件。如果这一切都在操作系统之上运行,那么你就有一半的机会。
  • 我已经使用标志 armv4t arm-linux-gnueabihf-gcc -march=armv4t -mfloat-abi=hard -mfpu=vfp -marm -Wall sample.c -o sample 进行了编译

标签: gcc arm


【解决方案1】:

这是一个维基帖子。 ARM 有许多不同的架构,每个架构都支持多个 CPU。

请参阅:List of ARM CPUs at wikipedia

Gcc 支持两种针对 ARM 生成代码的概念。

  1. 使用-march 定位架构。
  2. 使用 -mcpu 定位特定 CPU。

什么是架构?

一个架构的指令集(可能是汇编程序)在该架构中的 CPU 之间具有 95-100% 的相同性。有时会添加一些指令,例如除法、更多/扩展浮点寄存器等。但是,其目的是编译器可以轻松地输出将在这组 CPU(相同架构)上相对轻松地运行的代码。每个新架构都试图向后兼容以前的架构。

主要区别在于 系统寄存器 可能在 CPU 之间存在很大差异,即使在相同架构中也是如此。所以系统/操作系统软件会有很大的不同。


如何验证你的二进制目标是什么 CPU?

您可以使用objdumpreadelf 等工具。 7-AARMv7-A 之类的任何输出都是架构参考,您需要了解或查阅表格以查找支持的特定 CPU。 ARM 命名可能会令人困惑,因为 ARM7 与 ARMv7 完全不同。注意'v'。

【讨论】:

  • A post 有类似的概念问题。
  • 您需要不同的编译器。 arm-linux-gnueabihf-gcc 是一个“硬浮点编译器”,这意味着这些库仅支持硬浮点并且由“Linux”托管。使用-mfloat-abi=soft。您的-march=armv4t 是正确的。如果编译器抱怨,您需要一个不同的编译器,而不是不同的命令行选项。一些编译器支持“multi-lib”并且可以使用软浮点和硬浮点。见:wiki.debian.org/ArmHardFloatPort
猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 2015-03-26
  • 2011-01-21
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多