GNU链接器LMA/VMA偏移异常及boot.bin缺失0x55AA问题求助
MBR引导程序编译链接问题解决(Cygwin64/Windows 11)
问题详情
在Windows 11的Cygwin64环境下开发MBR引导程序时,出现两个关键问题:
- 链接后VMA/LMA地址为
0x200007C00,而非预期的0x7C00 .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
相关产品推荐
相关产品推荐

