const 領域の問題が解決したと思って、コンパイラに含む問題は解決されたと
思っていたのだが、何だか、動作が怪しい・・・
少し調べると、クラスの初期化リストが正しく動いていないように感じた。
xxxx.lst を見ながら、xxxx.mot ファイルのバイナリーを色々調査すると、明
らかに呼ばれていない関数がある事が判った。
00004c96 <__GLOBAL__sub_I__Z5wait_v>:
このアドレス「0x00004c96」は、どうやら、「.ctor」に積まれているようだ。
今まで、スタティックに定義したクラスのコンストラクターは、
extern void rl78_run_preinit_array(void); extern void rl78_run_init_array(void); extern void rl78_run_fini_array(void);
の3つを走らせれば良いのだと思っていたが、どうやら、「ctor」に積まれた
アドレスもコールしておく必要があるようだ・・
そこで、リンカースクリプトに「ctor」、「dtor」リストのシンボルを追加して、
「start.s」に関数を呼ぶエントリーを追加、「init.c」から呼ぶようにしてみ
た。
※どの順番で呼ぶのか不明なので、ctor を最初に呼ぶようにした。
※ctor、dtor のエントリーアドレスを得る方法が判らないので、シンボル追加。
この「無理やり」な解決方法が合っているか不明ではあるけど・・・
とりあえず、初期化が正しく行われ、正常に動作しているようだ。
まだまだ、スタートアップの方法に問題を含んでいるのかもしれない・・・
ここは、時間が出来たら、もう少し厳密な調査をしたい。