我想为裸机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配置中进行一些更改?
答案 0 :(得分:5)
海湾合作委员会及其目标
GCC始终配置为为特定目标发出二进制文件。通常情况下,Linux上已有的gcc
具有目标" i486-linux-gnu"。您无法使用此编译器交叉编译到ARM目标。
因此您需要安装为该目标配置的另一个GCC;然后GCC和其他程序通常有一个前缀表示目标:在你的情况下,前缀是arm-none-eabi
,然后你使用arm-none-eabi-gcc
调用该GCC。您可以安装多个GCC,它们不进行交互(如果它们相互作用,您可能搞砸了一些东西 - 如果您手动操作,请始终安装在不同的目录中)。
<强>安装强>
如果您的Linux发行版提供了一个包&gt; 4.8.0,你应该尝试那个。 如果您想安装多个版本(并且能够轻松地在它们之间切换),第二个选项可能更好。当第二个选项可用时,我停止为ARM编译GCC。
<强>交叉编译强>
$(CC)
,并将其指定为:TOOLCHAIN = arm-none-eabi-
CC = $(TOOLCHAIN)gcc
-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-
。