引导加载程序分为 2 个阶段。第一阶段是用汇编编写的,只加载第二阶段,第二阶段是在 C 中。Stage1 将 C 中的代码加载到地址 0x0500:0,然后跳转到那里。Stage2 必须写“hello message”并停止。
我尝试了不同的方法来将起始地址设置为原始二进制文件:(但没有任何效果)
cc -nostartfiles -nostdlib -c stage2.c
ld -s -T scrptfile.ld stage2.o /* I'm using ld just to set starting address of executable */
objcopy -O binary stage2 stage2.bin /* delete all unuseful data */
链接器脚本
SECTIONS
{
. = 0x0500;
.text : { *(.text)}
.data : { *(.data)}
.bss : { *(.bss)}
}
也许我用 objcopy 删除了不应该删除的东西。
那我该如何执行这个 stage2.bin 呢?
据我了解,使用 32 位长度指令编写的 C 代码,而原始二进制文件只允许 16 个?
PS 参数 -set-start (objcopy) 返回错误:无效的 bfd 目标。是因为输出文件是二进制的吗?
谢谢你的回答。