私のARM9コードには、varargsを使用するデータ変換関数があります。私は数年前からarm-elfyagartoディストリビューションを問題なく使用しています。最近、yagartoサイトからarm-eabi-none yagartoパッケージにアップグレードしましたが、浮動小数点値に問題があることがわかりました。私が最終的に発見したのは、doubleが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`