2

我在使用可变参数的 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`
4

0 回答 0