我正在编译u-boot时遇到一个非常奇怪的错误:
载体
init_fnc_t *init_sequence[] ={...}
填充0' s / NULL而不是函数指针。我以为我通过手动调用所有这些函数来超越编译器#39;但是,由于驱动程序结构也获得了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
非常感谢任何帮助:)
答案 0 :(得分: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
(这些是单行,但为了便于阅读,我将其分开)