You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU链接器LMA/VMA偏移异常及boot.bin缺失0x55AA问题求助

MBR引导程序编译链接问题解决(Cygwin64/Windows 11)

问题详情

在Windows 11的Cygwin64环境下开发MBR引导程序时,出现两个关键问题:

  1. 链接后VMA/LMA地址为0x200007C00,而非预期的0x7C00
  2. .sig段在objdump中可见,但生成的boot.bin缺失0x55AA签名

以下是相关代码、命令及错误信息:

相关代码

boot.s

.code16
.text
.global start
start:
        jmp start

boot.ld

ENTRY(start)

SECTIONS
{
    . = 0x00007C00; /* Set the location counter to 0x7C00 */

    .text :
    {
        *(.text)
    }

    .data :
    {
        *(.data)
    }

    .sig 0x7DFE:
    {
        SHORT(0xaa55);
    }
}

编译链接命令

as -o boot.o .\boot.s
ld -T boot.ld -o boot.elf .\boot.o

链接错误

/usr/bin/ld: boot.elf:.text: section below image base
/usr/bin/ld: boot.elf:.sig: section below image base

objdump输出

objdump -h -D .\boot.elf

.\boot.elf:     file format pei-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000010  0000000200007c00  0000000200007c00  00000200  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .sig          00000002  0000000200007dfe  0000000200007dfe  00000400  2**2
                  CONTENTS, READONLY

Disassembly of section .text:

0000000200007c00 <start>:
   200007c00:   eb fe                   jmp    200007c00 <start>
   200007c02:   90                      nop
   200007c03:   90                      nop
   ...(省略多余nop指令)

Disassembly of section .sig:

0000000200007dfe <.sig>:
   200007dfe:   55                      push   %rbp
   200007dff:   aa                      stos   %al,%es:(%rdi)

二进制生成结果

生成命令:

objcopy -O binary .\boot.elf boot.bin

boot.bin内容(仅显示前16字节,无末尾的0x55AA):

EB FE 90 90 90 90 90 90 90 90 90 90 90 90 90 90

解决方案

1. 修复地址偏移问题

Cygwin默认的ld以x86-64 PE格式输出,会自动添加0x200000000的基地址偏移。需要强制指定目标架构为i386 ELF:

修改汇编和链接命令:

# 汇编时指定32位i386架构
as --32 -o boot.o boot.s
# 链接时使用i386 ELF格式,加载自定义脚本
ld -m elf_i386 -T boot.ld -o boot.elf boot.o

2. 修复签名缺失问题

原链接脚本中.sig段未标记ALLOC和LOAD属性,objcopy生成二进制时会跳过该段。可以将签名合并到.text段末尾,确保被包含:

修改后的boot.ld:

ENTRY(start)

SECTIONS
{
    . = 0x7C00;

    .text :
    {
        *(.text)
        // 定位到MBR签名的固定位置
        . = 0x7DFE;
        SHORT(0xaa55);
    }

    .data :
    {
        *(.data)
    }
}

3. 正确生成MBR二进制文件

链接完成后,用objcopy提取二进制,并验证文件大小为512字节:

objcopy -O binary boot.elf boot.bin
# 验证MBR标准大小
wc -c boot.bin

验证结果

执行上述步骤后:

  • objdump输出的VMA/LMA地址会变为预期的0x7C00
  • boot.bin文件大小为512字节,最后两个字节为0x55AA

内容的提问来源于stack exchange,提问作者Korsarq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:54:51