ARM EABI浮点数问题
我在ARM9代码中有一个数据转换函数,它使用varargs。 几年来,我一直在使用一款arm elf yagarto发行版 以前,没有问题。最近,我们升级到arm eabi none 来自yagarto网站的yagarto软件包,我发现我们现在有 浮点值的问题。我最终发现的是 双倍字节被强制设置为8字节边界,而现有的 varargs浮点处理程序不希望在args中找到间隙 我可以手动检查指针,并将其强制设置为8字节 边界(事实上,我这样做了,并且完全解决了这个问题),但是 我想知道为什么会突然发生这种情况 是否有编译器开关指定堆栈上的数据对齐方式, 或者在函数调用中,或者类似的东西??为什么会这样 在32位(4字节)体系结构上默认为8字节边界 我将非常感谢任何人能够提供的任何建议或见解 这些问题 代码很简单:ARM EABI浮点数问题,arm,eabi,Arm,Eabi,我在ARM9代码中有一个数据转换函数,它使用varargs。 几年来,我一直在使用一款arm elf yagarto发行版 以前,没有问题。最近,我们升级到arm eabi none 来自yagarto网站的yagarto软件包,我发现我们现在有 浮点值的问题。我最终发现的是 双倍字节被强制设置为8字节边界,而现有的 varargs浮点处理程序不希望在args中找到间隙 我可以手动检查指针,并将其强制设置为8字节 边界(事实上,我这样做了,并且完全解决了这个问题),但是 我想知道为什么会突然发生
.....
float floatValue = 10.0;
int intValue = 10;
char buffer[32];
...
snprintf (buffer, 32, "%g", floatValue); /* Here we are getting junk value bcz of 8-byte*/
snprintf (buffer, 32, "%lld", intValue); /* Here we are getting junk value bcz of 8-byte */
....
我们使用的GCC版本是4.7.1
编译选项:
工具链编译选项:
应用程序编译器选项:
如果将abi设置为较旧的,会发生什么情况?就像via'-mabi=apcs-gnu'Auselen一样,我只想使用aapcs,我认为问题在于结构大小边界,因为它硬编码为8位,而不是传递的1位(GCC ARM EABI)。但aapcs已经规定了这一点。获取ARM体系结构的过程调用标准副本并搜索
双字对齐类型将始终从偶数核心寄存器开始,或在堆栈上的双字对齐地址开始,即使它不是聚合的第一个成员。
Auselen-感谢您提供的信息。但我发现acps gnu删除了EABI支持,并且它将在ARMV4和更旧版本上得到支持。我们目前使用的是ARM9版本,EABI应该支持它。我发现在GCC中有一个bug记录在上面的链接中,但我不知道它最终是如何修复的。auselen-更新了示例代码。请您在这里输入一些信息好吗?如果您将abi设置为较旧的,会发生什么情况?就像via'-mabi=apcs-gnu'Auselen一样,我只想使用aapcs,我认为问题在于结构大小边界,因为它硬编码为8位,而不是传递的1位(GCC ARM EABI)。但aapcs已经规定了这一点。获取ARM体系结构的过程调用标准副本并搜索双字对齐类型将始终从偶数核心寄存器开始,或在堆栈上的双字对齐地址开始,即使它不是聚合的第一个成员。
Auselen-感谢您提供的信息。但我发现acps gnu删除了EABI支持,并且它将在ARMV4和更旧版本上得到支持。我们目前使用的是ARM9版本,EABI应该支持它。我发现在GCC中有一个bug记录在上面的链接中,但我不知道它最终是如何修复的。auselen-更新了示例代码。你能在这里提供一些信息吗?
`mabi=aapcs-linux
`mcpu=arm7tdmi/mcpu=arm946e-s`
`mfloat-abi=softfp`
`-mfloat-abi=softfp`
`-mfpu=vfp`
`-mstructure-size-boundary=8`
`-fomit-frame-pointer`
`-fshort-wchar`
`-fno-short-enums`