ARM EABI с плавающей точкой

У меня есть функция преобразования данных в нашем коде ARM9, который использует varargs. Пару лет назад я использовал дистрибутив arm-elf yagarto, без проблем. Недавно мы обновили пакет arm-eabi-none yagarto с сайта yagarto, и я обнаружил, что у нас теперь есть проблемы со значениями с плавающей запятой. В конечном итоге я обнаружил, что двойники вынуждены к 8-байтовым границам, и существующий обработчик с плавающей точкой varargs не ожидал найти пробелы в аргументах.

Я могу вручную проверить указатель и принудительно установить его до восьмибайтовой границы (фактически, я сделал это, и это полностью устранило проблему), но я хотел бы знать, почему это внезапно начало происходить.

Есть ли переключатель компилятора, который определяет выравнивание данных в стеке, или в вызовах функций, или что-то в этом роде? И почему он будет по умолчанию на 8-байтовых границах на 32-битной (4-байтовой) архитектуре??

Я был бы признателен за любые советы или идеи, которые кто-либо может дать по этим вопросам.

Код прост:

    .....
    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`

0 ответов

Другие вопросы по тегам