将多个 ARM 工具链添加到路径



所以我的目标是在我的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 的结果相同/相似,它确定它不需要帧并且默认情况下不使用帧,但如果您强制使用它,它会。

相关内容

  • 没有找到相关文章

最新更新