【问题标题】:Does the GNU Toolchain for Arm Processors provide support for classic processors such as the ARM11?ARM 处理器的 GNU 工具链是否提供对 ARM11 等经典处理器的支持?
【发布时间】:2020-12-24 06:17:22
【问题描述】:

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

【问题讨论】:

    标签: gcc raspberry-pi arm gnu-toolchain raspberry-pi-zero


    【解决方案1】:

    试试看

    .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 .
    

    没有警告/错误

        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- 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 最近被放弃了,但旧版本确实/确实支持它(至少有一个开放核心 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/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.xx 之后有一个明显的变化,这使得它非常需要保持,gcc 的优化走下坡路,二进制文件更大等等。新版本的 Ubuntu 等可能没有 gcc-5,所以你可以尝试gcc-7 相反,除非您可以自己构建它,否则您会丢失 gcc 5.xx,它最终将变得过时,gnu 人不倾向于编写旨在编译多年的干净 C 代码,所以一段时间后,他们自己的工具不会构建自己的工具。因此,如果您深陷其中,那么您可以在虚拟机上运行较旧的 Linux,然后在该 Linux 中获取或构建较旧的工具链(或 windows 或其他)。

    虽然 Raspberry Pi Zero 仍然存在,但我看不到 armv6 支持很快就会消失。这确实与维护者有关,也许与他们举办的这些会议有关。 pdp-11 支持是在几年前添加的,并且仍在维护中(pdp-11 至今仍在使用,尽管受到病毒对航空业的打击,将会看到,也许那里有升级的机会)。 (pdp-11,一个很好的学习汇编语言的第一个处理器,很好的模拟器,很容易自己编写)。


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

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

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 2018-08-15
      • 2015-04-05
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 2020-12-05
      • 2017-06-29
      • 2011-01-25
      相关资源
      最近更新 更多