所以,我有这个汇编文件,我用GNU组装,并使用链接描述文件与GNU ld链接。
链接描述文件(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_end
位于0x7dfe
,我希望用零填充漏洞,但不,boot.img
总共55个字节。对我来说,奇怪的是该文件甚至不包含引导签名。它只是.text
和.data
,没有.boot_end
或跳过的字节。
如何移动ld跳过这些字节?我的启动签名在哪里消失了?
答案 0 :(得分:2)
你很可能错过了一个部分标志。如果您稍后在链接到ELF以获取非标准(不是as
或.text
或类似的)部分名称时,如果没有为.data
提供部分标记,那么该部分将是不在转储中分配(即objcopy
默默忽略,请注意,在生成coff
个文件时,这种行为会有所不同)
尝试更换你的(大概)裸体
.section boot_end
使用在汇编程序输入文件中使用指令
.section boot_end,"a"
(或更多标志,例如使其可执行,具体取决于您的需要),然后重试。
“a”标志使可分配部分,即告诉您在二进制文件中想要它的ld
和objcopy
。