我正在做一个使用动态重定位的项目,它对Cortex-M4很好,但是Cortex-M0+有一些问题。
浮点函数的符号出现了一些问题。此核心没有浮点单位。
所以我试图理解两个内核(M4和M0+)生成的代码之间的区别。
代码如下:
#include <stdint.h>
#include <math.h> // <fastmath.h>
float a, b, c; //, d, e;
void ldMain(void)
{
a = 1.100000f + a;
b = 1.100000f - b;
c = 1.100000f * c;
//d = 1.100000f / d;
}
编译和链接的命令如下:
arm-none-eabi-gcc.exe -c TESTE.c -o TESTE.o0 -mthumb -mcpu=cortex-m0plus -O0 -mlong-calls -mword-relocations -mabi=atpcs -mfloat-abi=soft -mcaller-super-interworking
arm-none-eabi-ld.exe -o TESTE.o TESTE.o0 --relocatable --strip-all --discard-all --embedded-relocs
生成的符号是(get with arm none eabi readelf):
Relocation section '.rel.text' at offset 0x2e4 contains 6 entries:
Offset Info Type Sym.Value Sym. Name
00000028 00000b02 R_ARM_ABS32 00000004 a
0000002c 00000c02 R_ARM_ABS32 00000000 __addsf3
00000034 00000602 R_ARM_ABS32 00000004 b
00000038 00000802 R_ARM_ABS32 00000000 __subsf3
0000003c 00000902 R_ARM_ABS32 00000004 c
00000040 00000a02 R_ARM_ABS32 00000000 __mulsf3
与gcc命令上使用的标记-mcpu=cortex-m0plus或-mcpu=cortex-m4无关,生成的符号是相同的。
问题是,这些符号在CORTEX-M0PLUS上不存在。
cortex-m0plus(armv6-m)的lib gcc位于C:\程序文件(x86)GNU Tools ARM Embedded\4.9 2015q2\lib\gcc\ARM none eabi\4.9.3\armv6-m中,没有这些符号。它是用命令臂none eabi nm验证的。
有没有人知道为什么这些符号被用于CORTEX-M0PLUS?
我使用的是4.9版2015q2的GCC ARM嵌入式。
最佳答案
这些函数在GCC glibc(newlib或nanolib)中定义。这个职位差不多4岁了,我没有2015年海合会的经验。然而,最近的(如2018等)GCC肯定在库中有这些FP软件例程。
关于c - cortex-m0plus上的浮点库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32384037/