0

我目前在为 u-boot 编译时遇到了一个非常奇怪的错误:

向量

init_fnc_t *init_sequence[] ={...}

用 0/NULL 代替函数指针填充。我认为我通过“手动”调用所有这些函数来胜过编译器。然而,由于驱动结构也获得了 0 / NULL 指针,因此这个 bug 会产生更多影响:

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 正在运行一个单独的命令来修复 bin:

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

(这些是单行,但为了便于阅读,我将其拆分)

于 2014-10-10T12:25:07.743 回答