0

現在、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から入手できます 。

どんな助けでも大歓迎です:)

4

1 に答える 1

0

u-boot.bin ファイルは問題ないようです。これが機能する理由を調査したところ、u-boot の make がビンを修正するために別のコマンドを実行していることがわかりました。

start=$(aarch64-linux-gnu-nm u-boot | grep __rel_dyn_start | cut -f 1 -d ' ');
end=$(aarch64-linux-gnu-nm u-boot | grep __rel_dyn_end | cut -f 1 -d ' '); 
tools/relocate-rela u-boot.bin 0x3e900000 $start $end

(これらは1行でしたが、読みやすくするために分割しました)

于 2014-10-10T12:25:07.743 に答える