因此,我有这个汇编文件,我使用 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) }
}
正如你所看到的,我尝试通过执行以下操作使文件恰好满足引导加载程序所需的 512 字节. = 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
is at 0x7dfe
我希望这些洞能被零填满,但是没有,boot.img
总共55个字节。对我来说,奇怪的是该文件甚至不包含启动签名。只是.text
and .data
没有任何一个.boot_end
或跳过的字节。
如何移动 ld 以跳过这些字节?我的启动签名哪里去了?
您很可能缺少一个部分标志。要点是,如果没有给出节标志as
当您稍后链接到 ELF 以获得非标准(不是.text
or .data
或类似的)节名称,该节将不会在转储中分配(即,默默地被忽略)objcopy
,请注意,这在生成时的行为有所不同coff
files)
尝试更换你的(大概)裸体
.section boot_end
汇编器输入文件中的指令
.section boot_end,"a"
(或更多标志,例如使其可执行,具体取决于您的需要)并重试。
“a”标志构成该部分可分配的,即告诉两者ld
and objcopy
你想要它在你的二进制文件中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)