在Linux上为裸机ARM准备GNU工具链

时间:2015-03-10 12:12:54

标签: linux gcc arm gnu

我想为裸机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配置中进行一些更改?

1 个答案:

答案 0 :(得分:5)

海湾合作委员会及其目标

GCC始终配置为为特定目标发出二进制文件。通常情况下,Linux上已有的gcc具有目标" i486-linux-gnu"。您无法使用此编译器交叉编译到ARM目标。

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

<强>安装

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

如果您的Linux发行版提供了一个包&gt; 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-