3

所以,我有这个汇编文件,我用 GNU as 汇编它并使用链接器脚本与 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. .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 以跳过这些字节?我的引导签名到哪里去了?

4

1 回答 1

3

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

尝试更换你的(大概)赤身裸体

.section boot_end 

汇编器输入文件中的指令

.section boot_end,"a" 

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

“a”标志使该部分可分配,即告诉两者ld并且objcopy您希望它在您的二进制文件中。

于 2016-10-06T15:56:50.790 回答