これは本当にあった話ですが…
その日、私はいつも通りにプログラムを書いていたんですよ。すると、.dataセクションに置く必要のあるデータがあったので、
.section .data
FOO: .byte 0x01, 0x02, 0x03, 0x04
という具合に書いたんですよ。
でもプログラムを動かしてみるとどうも動作がおかしい。不審に思った私は逆アセンブル結果を見てみました。
そうしたら、なんと.dataセクションが初期化されてなかったんです!!
How to OHARAY(御祓い)
この手の問題は般若心境を唱えても解決しません。もちろん法華経もお清めの塩も聖書も十字架も効きません。
本来ならば.dataセクションの初期化コードはリンカが自動生成してくれます。しかし、組み込みなどのメモリが限られている環境ではわずかな初期化コードですらメモリを圧迫します。そのため、.bssセクションをゼロクリアしないという話は聞いたことがありますが、まさか.dataセクションも初期化されないとは…
ソースコードに
.global __do_copy_data
と書くことでこの問題は解決します。
同様に.bssセクションをゼロクリアするためには
.global __do_clear_bss
と書くといいです。
__do_copy_dataで検索してもまともな記事が無いので正式な方法ではないかもしれません。正式な方法を知っている人がいたら教えてください。
複数のソースファイルから成っている場合はどれか1つのソースコードに書けばいいです。
by Shiozaki