【问题标题】:Preparing GNU toolchain for bare metal ARM on Linux在 Linux 上为裸机 ARM 准备 GNU 工具链
【发布时间】:2015-03-10 12:12:53
【问题描述】:

我想为裸机 ARM 准备 GNU 工具链,以便与 Geany IDE 一起使用。有一些这样的教程:Building the GNU ARM Toolchain for Bare Metal 但我不明白几个步骤。

首先,使用Linux操作系统的每个人都隐含着gcc、binutils和gdb,那为什么要下载别人呢?其次,所有教程都告诉我用类似的东西配置 gcc:*./configure --target=arm-elf。它甚至有什么作用?它只是强迫我在命令行中使用 arm-elf-gcc 而不是 gcc 调用 gcc 还是改变了我的 gcc 的一些内部选项?

到目前为止,我已经准备好了 makefile,但我仍然不确定编译器选项。我没有更改任何 gcc 配置选项,我用这样的标志调用编译器:

CFLAGS = -Wall -std=c99 -march=armv7-m -mtune=cortex-m0

我可以通过使用适当的参数调用 gcc 来准备工具链,还是需要对 gcc 配置进行一些更改?

【问题讨论】:

  • 您是否在编译器中至少尝试了这些选项?它奏效了吗?这是否给你一个关于为什么准备的线索。步骤是必要的吗?
  • 我建议你离开并调查“交叉编译”......
  • 到目前为止我还没有尝试过,因为我看到的每个教程都包括配置 --target=arm-elf 没有解释它对编译器的实际作用,如果我只是调用 gcc争论甚至是可能的。

标签: linux gcc arm gnu


【解决方案1】:

GCC 及其目标

GCC 始终配置为为特定目标 发出二进制文件。所以通常在 Linux 上已经可用的gcc 的目标是“i486-linux-gnu”。您不能使用此编译器交叉编译到 ARM 目标。

因此您需要安装另一个为该目标配置的 GCC;那么 GCC 和其他程序通常有一个指示目标的前缀:在您的情况下,前缀是 arm-none-eabi,然后您使用 arm-none-eabi-gcc 调用该 GCC。您可以有多个 GCC 安装,它们不交互(如果它们交互,您可能搞砸了一些东西 - 如果您手动执行,请始终安装在单独的目录中)。

正在安装

  • 如果您的 Linux 发行版提供了一个软件包,您可以只安装那个(在 Debian 上是“gcc-arm-none-eabi”)。
  • 您可以下载预编译包:GNU Tools for ARM Embedded Processors
  • 您可以尝试编译一个。如果您想要正确的多库,这并不容易。

如果您的 Linux 发行版提供了一个 > 4.8.0 的软件包,您应该尝试那个。 如果您想安装多个版本(并且能够轻松地在它们之间切换),第二个选项可能更好。当第二个选项可用时,我停止为 ARM 编译 GCC。

交叉编译

  • 在您的 Makefile 中,您必须确保使用了交叉编译器。您可以在 Makefile 中使用 $(CC),并像这样分配它:
TOOLCHAIN = arm-none-eabi-
CC = $(TOOLCHAIN)gcc
  • Cortex-M0 的编译器标志是-mcpu=cortex-m0 -mthumb -mfloat-abi=soft,按照惯例分配给CFLAGS
CFLAGS += -mcpu=cortex-m0 -mthumb -mfloat-abi=soft

然后将.c 编译为.o 的(简单)规则看起来像

%.o: %.c
    $(CC) $(CFLAGS) -o $@ -c $<

使用arm-elf- 前缀的教程已过时。目前arm-none-eabi-正在使用中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2015-07-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2010-11-20
    相关资源
    最近更新 更多