链接器脚本未按预期跳过字节

Linker Script Does Not Skip Bytes As Expected

所以,我有这个汇编文件,我 assemble 使用 GNU as 和 link 使用 GNU ld 使用 linker 脚本。

链接描述文件(boot.ld):

INPUT(boot.o)
OUTPUT(boot.out)
ENTRY(boot_start)

SECTIONS {
        . = 0x7c00;
        .text : { *(.text) }
        .data : { *(.data) }
        . = 0x7dfe;
        .boot_end : { *(.boot_end) }
}

如您所见,我尝试通过执行 . = 0x7cdfe 使文件恰好为引导加载程序所需的 512 字节。 .boot_end 包含引导签名,因此会填满剩余的两个字节。

我创建引导加载程序如下:

m4 boot.S | as -o boot.o
ld -T boot.ld
objcopy -O binary boot.out boot.img

boot.out 包含已经具有绝对地址的部分,一切似乎都很好。 .boot_end0x7dfe 处,我希望空洞用零填充,但不,boot.img 总共有 55 个字节。对我来说,奇怪的是该文件甚至不包含引导签名。它只是 .text.data,没有 .boot_end 或跳过的字节。

如何移动 ld 以跳过这些字节?我的引导签名去哪儿了?

您很可能缺少节标志。要点是,如果稍后为非标准(不是 .text.data 等)节名称链接到 ELF 时,如果没有给 as 节标志,该节将未在转储中分配(即,被 objcopy 默默忽略,请注意,这在生成 coff 文件时表现不同)

尝试更换您的(大概)裸体

.section boot_end 

汇编器输入文件中的指令

.section boot_end,"a" 

(或更多标志,例如使其可执行,具体取决于您的需要)并重试。

"a" 标志使部分 可分配 ,即告诉 ldobjcopy 你想要它在你的二进制文件中。