用于Arm处理器的GNU工具链是否为ARM11等经典处理器提供支持



最近我对学习产生了兴趣"裸金属";使用本机汇编开发ARM处理器。我买了一台带有ARM11处理器的Raspberry Pi Zero,目前正在寻找一个工具链来组装和链接我的代码。本页上说,GNU用于Arm处理器的工具链只支持A、R和M配置文件,但我看到了这个来源,它表明GCC能够编译Arm架构的代码,一直到ARMv4,并且确实支持我想要编译的处理器(ARM1176JZF-S)。我这里缺什么了吗?这些都是相互矛盾的来源,不是吗?如果GNU工具链实际上不支持ARM11处理器,我还有什么其他选择?

试试

.cpu arm7tdmi
.globl _start
_start:
bl main
b .
.globl bounce
bounce:
bx lr
int bounce ( int x );
int main ( void )
{
return(bounce(3));
}
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
arm-none-eabi-as --version
GNU assembler (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-none-eabi'.
arm-none-eabi-as start.s -o start.o
arm-none-eabi-gcc -O2 -c -march=armv4t so.c -o so.o
arm-none-eabi-ld -Ttext=0x1000 start.o so.o -o so.elf
arm-none-eabi-objdump -d so.elf
Disassembly of section .text:
00001000 <main>:
1000:   e92d4010    push    {r4, lr}
1004:   e3a00003    mov r0, #3
1008:   eb000003    bl  101c <bounce>
100c:   e8bd4010    pop {r4, lr}
1010:   e12fff1e    bx  lr
00001014 <_start>:
1014:   ebfffff9    bl  1000 <main>
1018:   eafffffe    b   1018 <_start+0x4>
0000101c <bounce>:
101c:   e12fff1e    bx  lr

(不,这不是一个完整的功能程序,只是一个工具演示)

请记住,gnu-binutils(汇编程序、链接器和其他二进制实用程序)和gnu-gcc(c编译器)是两个独立的项目,因此它们可能不完全同步,一个可能支持另一个不支持的东西。

我认为他们放弃了对armv2/3的支持,armv2/3是最近工具中的橡子,可能是gcc中的实际芯片。

arm-none-eabi-gcc -O2 -c -mcpu=arm2 so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -mcpu target: arm2
arm-none-eabi-gcc: note: valid arguments are: arm8 arm810 strongarm 
strongarm110 fa526 fa626 arm7tdmi arm7tdmi-s arm710t arm720t arm740t arm9 arm9tdmi arm920t arm920 arm922t arm940t ep9312 arm10tdmi arm1020t arm9e arm946e-s arm966e-s arm968e-s arm10e arm1020e arm1022e xscale iwmmxt iwmmxt2 fa606te fa626te fmp626 fa726te arm926ej-s arm1026ej-s arm1136j-s arm1136jf-s arm1176jz-s arm1176jzf-s mpcorenovfp mpcore arm1156t2-s arm1156t2f-s cortex-m1 cortex-m0 cortex-m0plus cortex-m1.small-multiply cortex-m0.small-multiply cortex-m0plus.small-multiply generic-armv7-a cortex-a5 cortex-a7 cortex-a8 cortex-a9 cortex-a12 cortex-a15 cortex-a17 cortex-r4 cortex-r4f cortex-r5 cortex-r7 cortex-r8 cortex-m7 cortex-m4 cortex-m3 marvell-pj4 cortex-a15.cortex-a7 cortex-a17.cortex-a7 cortex-a32 cortex-a35 cortex-a53 cortex-a57 cortex-a72 cortex-a73 exynos-m1 xgene1 cortex-a57.cortex-a53 cortex-a72.cortex-a53 cortex-a73.cortex-a35 cortex-a73.cortex-a53 cortex-a55 cortex-a75 cortex-a76 neoverse-n1 cortex-a75.cortex-a55 cortex-a76.cortex-a55 cortex-m23 cortex-m33 cortex-r52; did you mean ‘arm8’?
arm-none-eabi-gcc -O2 -c -march=armv2a so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -march target: armv2a
arm-none-eabi-gcc: note: valid arguments are: armv4 armv4t armv5t armv5te armv5tej armv6 armv6j armv6k armv6z armv6kz armv6zk armv6t2 armv6-m armv6s-m armv7 armv7-a armv7ve armv7-r armv7-m armv7e-m armv8-a armv8.1-a armv8.2-a armv8.3-a armv8.4-a armv8.5-a armv8-m.base armv8-m.main armv8-r iwmmxt iwmmxt2; did you mean ‘armv4’?

旧版本的gcc可以使用它。

.cpu arm2
.globl _start
_start:
bl main
b .

无警告/错误

100c:   e8bd4010    pop {r4, lr}
1010:   e12fff1e    bx  lr

这意味着armv4t与

arm-none-eabi-gcc -O2 -c -march=armv5t so.c -o so.o
arm-none-eabi-objdump -D so.o
so.o:     file format elf32-littlearm

Disassembly of section .text.startup:
00000000 <main>:
0:   e3a00003    mov r0, #3
4:   eafffffe    b   0 <bounce>

嗯,他们甚至做了一个尾部优化,好吧。

int bounce ( int x );
int main ( void )
{
return(bounce(3)+2);
}
00000000 <main>:
0:   e92d4010    push    {r4, lr}
4:   e3a00003    mov r0, #3
8:   ebfffffe    bl  0 <bounce>
c:   e2800002    add r0, r0, #2
10:   e8bd8010    pop {r4, pc}

armv4t和armv5t之间的区别在于,你可以弹出pc,但不能将其用于arm/thumb交互,因此除非可能,否则编译器将生成兼容交互的代码。

因此,是的,即使使用gcc 9.3.0,它也是受支持的。我用错了电脑,我以为我有这台电脑的最新版本,会用10.2.0 编辑答案

编辑

是的,我应该重写一下,也许我会。。。

arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
arm-none-eabi-as --version
GNU assembler (GNU Binutils) 2.35
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-none-eabi'.

.cpu arm2
.globl _start
_start:
bl main
b .
.globl bounce
bounce:
@    bx lr
mov pc,lr
arm-none-eabi-as start.s -o start.o
arm-none-eabi-objdump -d start.o
start.o:     file format elf32-littlearm

Disassembly of section .text:
00000000 <_start>:
0:   ebfffffe    bl  0 <main>
4:   eafffffe    b   4 <_start+0x4>
00000008 <bounce>:
8:   e1a0f00e    mov pc, lr

或者尝试原始程序

arm-none-eabi-as start.s -o start.o
arm-none-eabi-gcc -O2 -c -march=armv4t so.c -o so.o
arm-none-eabi-ld -Ttext=0x1000 start.o so.o -o so.elf
arm-none-eabi-objdump -d so.elf
so.elf:     file format elf32-littlearm

Disassembly of section .text:
00001000 <main>:
1000:   e92d4010    push    {r4, lr}
1004:   e3a00003    mov r0, #3
1008:   eb000003    bl  101c <bounce>
100c:   e8bd4010    pop {r4, lr}
1010:   e12fff1e    bx  lr
00001014 <_start>:
1014:   ebfffff9    bl  1000 <main>
1018:   eafffffe    b   1018 <_start+0x4>
0000101c <bounce>:
101c:   e12fff1e    bx  lr

所以10.2.0和2.35都支持这个核心/cpu。

arm-none-eabi-gcc -O2 -c -march=arm2a so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -march target: arm2a
arm-none-eabi-gcc: note: valid arguments are: armv4 armv4t armv5t armv5te armv5tej armv6 armv6j armv6k armv6z armv6kz armv6zk armv6t2 armv6-m armv6s-m armv7 armv7-a armv7ve armv7-r armv7-m armv7e-m armv8-a armv8.1-a armv8.2-a armv8.3-a armv8.4-a armv8.5-a armv8.6-a armv8-m.base armv8-m.main armv8-r armv8.1-m.main iwmmxt iwmmxt2
arm-none-eabi-gcc: error: missing argument to ‘-march=’
arm-none-eabi-gcc -O2 -c -mcpu=arm2 so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -mcpu target: arm2
arm-none-eabi-gcc: note: valid arguments are: arm8 arm810 strongarm strongarm110 fa526 fa626 arm7tdmi arm7tdmi-s arm710t arm720t arm740t arm9 arm9tdmi arm920t arm920 arm922t arm940t ep9312 arm10tdmi arm1020t arm9e arm946e-s arm966e-s arm968e-s arm10e arm1020e arm1022e xscale iwmmxt iwmmxt2 fa606te fa626te fmp626 fa726te arm926ej-s arm1026ej-s arm1136j-s arm1136jf-s arm1176jz-s arm1176jzf-s mpcorenovfp mpcore arm1156t2-s arm1156t2f-s cortex-m1 cortex-m0 cortex-m0plus cortex-m1.small-multiply cortex-m0.small-multiply cortex-m0plus.small-multiply generic-armv7-a cortex-a5 cortex-a7 cortex-a8 cortex-a9 cortex-a12 cortex-a15 cortex-a17 cortex-r4 cortex-r4f cortex-r5 cortex-r7 cortex-r8 cortex-m7 cortex-m4 cortex-m3 marvell-pj4 cortex-a15.cortex-a7 cortex-a17.cortex-a7 cortex-a32 cortex-a35 cortex-a53 cortex-a57 cortex-a72 cortex-a73 exynos-m1 xgene1 cortex-a57.cortex-a53 cortex-a72.cortex-a53 cortex-a73.cortex-a35 cortex-a73.cortex-a53 cortex-a55 cortex-a75 cortex-a76 cortex-a76ae cortex-a77 neoverse-n1 cortex-a75.cortex-a55 cortex-a76.cortex-a55 cortex-m23 cortex-m33 cortex-m35p cortex-m55 cortex-r52; did you mean ‘arm8’?
arm-none-eabi-gcc: error: missing argument to ‘-march=’

你可以在那里看到arm1176jzf-s版本,其中一个是树莓π零。

arm-none-eabi-与arm-linux-gnueabi-,arm-and-whatever,除非在工具的构建中可能配置,否则都将支持相同版本的gcc(或binutils)的相同目标。

编辑笔记

arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
arm-linux-gcc -mno-thumb-interwork -O2 -c -mcpu=arm2 -march=armv2a so.c -o so.o

这是关于gcc支持armxyz吗。arm2/3最近被弃用,但旧版本确实支持它(我想至少有一个开放核心的armv2/3是免费的,所以如果你想使用它,你会想要一些工具)。

但从以上使用当前工具(10.2.0和2.35)的演示来看,到目前为止的armv4/4t(armv7-a/r/m)似乎得到了gcc和binutils的支持。

因此,由于他们确实在某一点上清除了arm2/3,这可能并不太难,就机器代码而言,arm2/3和目前的armv4到armv7之间存在重叠,arm2/3中的一些指令没有通过橡子/高级转换(芯片到核心,不同的公司),有些/很多重叠。与从armv4到armv7的重叠一样。因此,从技术上讲,他们可能希望在某个时候删除armv4支持,因为它有一些特殊情况,如上所示。但是,如果你费心去挖掘这些来源,你会发现它们似乎是用胶带和打捞线固定在一起的,所以我无法想象会有强烈的欲望进去把东西挖出来,即使你只是搜索armv4、armv5或armv6,或者标志的任何变量名来指示这些。

他们以前也这样做过,可能还会这样做,所以要做好准备,在切换到工具时测试工具的每个构建,或者更好的是在构建中明确表示,这样,如果/当工具放弃支持时,它将无法构建。

在这种情况下,你所做的就是使用一个旧的。在Debian/Ubuuntu/Mint等上

sudo apt-get -y install gcc-arm-linux-gnueabi binutils-arm-linux-gnueabi
sudo apt-get -y install gcc-5-arm-linux-gnueabi

这将不是最前沿的,他们将是几个主要的转速回来。但在gcc 5.x.x之后发生了一个明显的变化,这使得人们非常希望保留它,gcc的优化走下坡路,二进制文件更大,等等。Ubuntu等的新版本可能没有gcc-5,所以你可以尝试gcc-7,除非你自己构建它,否则你会失去gcc 5.x.x,这最终会变得过时,gnu的人不倾向于编写干净的C代码,这些代码将在未来许多年内编译,因此他们自己的工具在一段时间后不会构建自己的工具。因此,如果你陷入了困境,那么你就在虚拟机上运行一个旧的Linux,在这个Linux中,你可以获取或构建旧的工具链(或windows或其他什么)。

虽然Raspberry Pi Zero仍然存在,但我认为armv6支持不会很快消失。这确实与维护人员有关,也许还有他们举办的这些会议。pdp-11支持是在不久前增加的,现在仍然保持(pdp-11今天仍在使用,尽管随着病毒对航空业的打击,我们会看到,也许有机会升级)。(pdp-11,一个很好的学习汇编语言的第一个处理器,很好的模拟器,而且很容易自己编写)。


是否仍支持ARM11(在Pi Zero中)?是的,gcc和binutils仍然支持它。

如果他们不这样做,我该怎么办?使用较旧的工具链,或者更糟的情况是,运行支持构建/运行较旧工具链的较旧操作系统。

最新更新