所以我的目标是在我的Mac上编译armv2 32位,这样它就不会使用FP寄存器,我的老师告诉我,FP寄存器不是在早期版本的arm 32中。
我在想,如果我使用早期版本的工具链,它可能会支持 armv2,所以虽然我目前将 gcc-arm-none-eabi-9-2019-q4-major添加到路径中,但我也可能将 gcc-arm-none-eabi-8-2018-q4-major添加到路径中。
这是他们两个都有二进制arm-none-eabi-gcc的问题,这就是我想使用的,如果我将两者添加到我的路径中......我不确定如何指定是使用 2019-q4 还是 2018-q4 版本的 gcc。关于如何设置它有什么好主意吗?
如果有人知道如何强制编译为 armv2,这也是一个奖励,这也很有用,所以我可以看到早期版本是否没有使用 fp。 谢谢!
你的工具会告诉你你需要知道的一切,不需要使用SO。
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 9.2.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-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’?
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 5.4.0
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-none-eabi-gcc -c -march=armvxx so.c -o so.o
arm-none-eabi-gcc: error: unrecognized argument in option ‘-march=armvxx’
arm-none-eabi-gcc: note: valid arguments to ‘-march=’ are: armv2 armv2a armv3 armv3m armv4 armv4t armv5 armv5e armv5t armv5te armv6 armv6-m armv6j armv6k armv6s-m armv6t2 armv6z armv6zk armv7 armv7-a armv7-m armv7-r armv7e-m armv7ve armv8-a armv8-a+crc iwmmxt iwmmxt2 native
所以在 5.4.0 和 9.2.0 之间的某个地方,gcc 放弃了对 armv2 的支持,我怀疑它是 6.x.x,但 gcc 的发行说明是在哪里寻找。
谷歌
gcc no frame pointer
你会发现
-fomit-frame-pointer
-fno-omit-frame-pointer
测试它
unsigned int test ( unsigned int a, unsigned int b )
{
return(a+b);
}
arm-none-eabi-gcc -S -march=armv2 so.c
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
现在这构建了无法使用的代码,因为它使用 bx LR,所以也许 GCC 5.x.x 也不好。 但要继续
arm-none-eabi-gcc -fomit-frame-pointer -S -march=armv2 so.c
test:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
sub sp, sp, #8
str r0, [sp, #4]
您也可以在 armv4 和更高版本中尝试此操作 GCC 5.x.x 似乎默认使用帧指针
9.2.0 默认情况下也使用帧指针,但 -fomit-frame-pointer 选项也有效
(我故意没有优化,因为这不会使用堆栈,将不得不创建一个不同的测试函数来强制使用堆栈和对框架的渴望(。
unsigned int another_test ( unsigned int );
unsigned int test ( unsigned int a, unsigned int b )
{
return(another_test(a)<<b);
}
arm-none-eabi-gcc -O2 -S -march=armv7-a so.c
test:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, lr}
arm-none-eabi-gcc -fno-omit-frame-pointer -O2 -S -march=armv7-a so.c
test:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
push {r4, r5, fp, lr}
add fp, sp, #12
优化和旧版本的 gcc 的结果相同/相似,它确定它不需要帧并且默认情况下不使用帧,但如果您强制使用它,它会。