現在、u-boot 用にコンパイルしているときに、非常に奇妙なバグが発生しています。
ベクトル
init_fnc_t *init_sequence[] ={...}
関数ポインタの代わりに 0 / NULL で埋められます。これらすべての関数を「手動で」呼び出すことで、コンパイラの裏をかいたと思いました。ただし、ドライバー構造体も 0 / NULL ポインターを取得するため、このバグにはさらに多くの影響があります。
static struct serial_device my_serial_drv = {
.name = "my_serial",
.start = my_serial_init,
.stop = NULL,
.setbrg = my_serial_setbrg,
.putc = my_serial_putc,
.puts = my_serial_puts,
.getc = my_serial_getc,
.tstc = my_serial_tstc,
};
もちろん、私が電話したとき
'my_serial_drv'->start();
PCを0に設定し、その後すべてをクラッシュさせます。
楽しい事実: .name はバイナリに到達するため、.data セクションは、一度設定すればおそらく問題ありません。
これを aarch64-linux-gnu-*-4.7 および aarch64-linux-gnu-*-4.9 バイナリでテストしました。4.9 はhttp://releases.linaro.org/latest/components/toolchain/binariesから入手できます 。
どんな助けでも大歓迎です:)