如何解决用于手臂处理器的GNU工具链是否提供对经典处理器例如ARM11的支持?
最近,我对使用本机汇编学习ARM处理器的“裸机”开发产生了兴趣。我购买了具有ARM11处理器的RaspBerry Pi Zero,目前正在寻找组装和链接我的代码的工具链。它在this page上说,用于Arm处理器的GNU工具链仅支持A,R和M配置文件,但是我遇到过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编译器)是两个单独的项目,因此,人们期望它们不完全同步,其中一个可能支持另一个却不支持。 / p>
我认为他们放弃了对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}
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-whatever-whatever(除非已在该工具的版本中进行了配置)都将为相同版本的gcc(或binutils)支持相同的目标。 / p>
编辑说明
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)开始,gcc和binutils支持armv4 / 4t到目前的版本(armv7-a / r / m)。
因此,由于他们确实在某一点上清除了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是一个很好的学习汇编语言的第一个处理器,有很好的模拟器,可以轻松编写自己的语言。)
仍然支持ARM 11(在Pi Zero中)吗?是的,gcc和binutils仍然支持它。
如果/不这样做怎么办?使用较旧的工具链,或更糟糕的情况是,运行支持构建/运行较旧工具链的较旧操作系统。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。