我在使用可变参数的 ARM9 代码中有一个数据转换函数。几年前我一直在使用 arm-elf yagarto 发行版,没有任何问题。最近,我们从 yagarto 站点升级到 arm-eabi-none yagarto 包,我发现我们现在遇到浮点值问题。我最终发现双精度值被强制使用 8 字节边界,而现有的 varargs 浮点处理程序没想到会在 args 中找到间隙。
我可以手动检查指针并强制它达到 8 字节边界(事实上,我这样做了,并且完全解决了问题),但我想知道为什么突然开始发生这种情况。
是否有一个编译器开关指定堆栈上的数据对齐,或在函数调用中,或类似的东西?为什么在 32 位(4 字节)架构上默认为 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
编译选项:
工具链编译选项:
`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`