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`