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

Does the GNU Toolchain for Arm Processors provide support for classic processors such as the ARM11?

最近我对学习使用本机汇编的 ARM 处理器的“裸机”开发产生了兴趣。我买了一个 Raspberry Pi Zero,它具有 ARM11 处理器,目前正在寻找 assemble 和 link 我的代码的工具链。它在 this page that only the A, R and M profiles are supported by the GNU Toolchain for Arm Processors, but I have come across this source 上表示,这表明 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 的支持,它是橡子,在最近的工具中可能是 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 .

没有warnings/errors

    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 都支持这个 core/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 版本,其中一个在 raspberry pi 零中。

arm-none-eabi- vs arm-linux-gnueabi-, arm-whatever-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 最近被删除了,但旧版本 do/did 支持它(至少有一个开放核心 armv2/3 我猜它是免费的,所以如果你想使用它你会想要一些工具)。

但是从上面使用当前工具(10.2.0 和 2.35)的演示来看,armv4/4t 到现在(armv7-a/r/m)似乎都受 gcc 和 binutils 支持。

因此,由于他们确实在某一点上清除了 arm2/3,这可能不太难,因此就机器代码而言,arm2/3 和当前的 armv4 到 armv7 之间存在重叠继续,arm2/3 中有一些指令没有跨越 acorn/advanced 过渡(芯片到内核,不同的公司)some/many 重叠。就像从 armv4 到 armv7 的重叠一样。因此,从技术上讲,他们可能希望例如在某个时候删除 armv4 支持,因为它有一些如上所示的特殊情况。但如果你费心去挖掘源代码,你会发现它们似乎是用胶带和钢丝绑在一起的,所以我无法想象会有强烈的进去撕东西的欲望,即使你只是简单地搜索armv4 或 armv5 或 armv6 或标志的任何变量名称表示这些。

他们以前做过,他们可能会再次这样做,所以请做好准备,在您切换到工具时测试每个工具版本,或者最好在您的版本中明确说明,以便 if/when 该工具支持它将无法构建。

在这种情况下,您要做的是使用旧版本。在 Debian/Ubuntu/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 零仍然存在,但我认为 armv6 支持不会很快消失。这真的与维护者有关,也许与他们举行的这些会议有关。 pdp-11 支持是在不久前添加的,并且仍在维护中(pdp-11 今天仍在使用,尽管病毒对航空业造成了打击,但也许有机会在那里升级)。 (pdp-11,学习汇编语言的第一个处理器,很好的模拟器,很容易编写你自己的)。


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

我该怎么做 if/when 他们不做?使用较旧的工具链,或者更糟的情况,运行 支持 building/running 较旧工具链的较旧操作系统。