【问题标题】:Setting start address to execute raw binary file设置起始地址以执行原始二进制文件
【发布时间】: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


【解决方案1】:

. = 0x0500 不对应于0x0500:0。 0x0500:0 是物理地址0x5000,而不是0x500。

另外,如果您尝试将 C 代码编译为 32 位并在实模式(即 16 位)下运行,它将无法工作。您需要将代码编译为 16 位或将 CPU 切换到 32 位保护模式。没有那么多 C 编译器仍在编译 16 位代码。 Turbo C++ 是一个,Open Watcom 是另一个。 AFAIK,gcc 做不到。

最后,我猜您希望入口点位于 0x500:0(0x5000 物理位置)。您需要将此告诉链接器(我不记得如何,如果可能的话)或处理入口点的任意位置(即以某种方式从二进制文件中提取它)。

【讨论】:

    猜你喜欢
    • 2019-07-31
    • 2021-12-04
    • 1970-01-01
    • 2020-09-25
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多