【发布时间】:2012-07-16 23:41:22
【问题描述】:
引导加载程序分为 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 位?
附:参数 -set-start (objcopy) 返回错误:无效的 bfd 目标。是因为输出文件是二进制的吗?
感谢您的回答。
【问题讨论】:
-
你能告诉我们你的链接器脚本吗?反汇编后你的代码看起来合理吗?
标签: gcc x86 linker bootloader osdev