初期値格納アドレスずれ
ふとしたことで、dataセクション用の初期化データの開始アドレスが、4バイト分ずれる理由に思い当たった。
世間では常識なんだろうけど、今頃気付く...
たぶんGCC4あたりのどこからか...まあちゃんと調べればわかると思うけど。
変数の初期値のアライメントが、4バイト境界から、8バイト境界へ変更されているようだ。
いまどき初期化される変数には、long longや、doubleもあるから、8バイト境界にそろえるのは理にかなってる、ような気もする。
今のGCCでは、textセクションが8バイト境界で終わらなかった場合、次の8バイト境界までスキップされて、dataセクションの初期値が始まっている。
0x0001388c __text_end__ = .
.data 0x10000000 0x930 load address 0x00013890
コードをわずかずつ変えてコンパイルして、textセクションのサイズを変えてみても、
必ず8バイト境界に置かれるようだ。
------
今まで使っていたスタートアップの中では、textセクションの最終番地の次の4バイト境界を開始アドレスとして、初期値のコピーを実行していた。
運がいい(悪い?)と、正しく動くが....
アライメントの指定を、8バイト境界に変更する。
たぶんこれで直ったはず...
------
リンカスクリプトと、スタートアップは、GCC3あたりから基本部分を使いまわしている。
当初は、問題なく動いていたのだが。ちゃんとメンテナンスしないといかんなあ。
あらためて、リスティングファイルをみる。
Cortex-M3はthumb2を使っていて、16ビットコードなのだけれど、textセクションは4バイト境界で終わるように、適時NOPが挿入されている。
アセンブラが内部で使う定数は32ビットなので、これで十分なのか。うーむ。
分かってしまえば何てことは無いのは、いつものことなのだが。
| 固定リンク | 0

コメント