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

Assembly 链接器脚本未按预期跳过字节,assembly,x86,ld,linker-scripts,objcopy,Assembly,X86,Ld,Linker Scripts,Objcopy,所以,我有这个汇编文件,我用GNU as汇编它,并用链接器脚本链接GNU ld 链接器脚本(boot.ld): 如您所见,我通过执行=0x7cdfe.boot\u end包含引导签名,因此会填充剩余的两个字节 我创建引导加载程序如下: m4 boot.S | as -o boot.o ld -T boot.ld objcopy -O binary boot.out boot.img boot.out包含已经有绝对地址的部分,一切看起来都很好.boot\u end位于0x7dfe处,我希望这些孔

所以,我有这个汇编文件,我用GNU as汇编它,并用链接器脚本链接GNU ld

链接器脚本(
boot.ld
):

如您所见,我通过执行
=0x7cdfe
.boot\u end
包含引导签名,因此会填充剩余的两个字节

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

m4 boot.S | as -o boot.o
ld -T boot.ld
objcopy -O binary boot.out boot.img
boot.out
包含已经有绝对地址的部分,一切看起来都很好
.boot\u end
位于
0x7dfe
处,我希望这些孔中会填满零,但是没有,
boot.img
总共是55个字节。对我来说,奇怪的是文件甚至不包含启动签名。它只是
.text
.data
而没有
.boot\u end
或跳过的字节


如何移动ld以跳过这些字节?我的启动签名到哪里去了?

您很可能丢失了一个分区标志。关键是,如果在以后链接到ELF以获取非标准(非
.text
.data
或类似)节名时,没有为
as
提供节标志,则不会在转储中分配该节(即,
objcopy
会自动忽略,请注意,在生成
coff
文件时,这种行为会有所不同)

试着换掉你的(大概是)裸体

在汇编程序输入文件中使用

.section boot_end,"a" 
(或更多标志,例如,使其可执行,具体取决于您的需要),然后重试


“a”标志使节成为可分配的,即告诉
ld
objcopy
您希望在二进制文件中使用它。

您为缺少的部分使用了哪些节名,以及您设置了哪些标志(作为
输入到
中的内容是什么)?您是否使用ELF或COFF或任何对象格式也很重要。@tofro
.boot\u end
是我缺少的部分,我用
组装成了
,就像在我的问题中写的那样。我使用ELF。您仍然没有说
。您在
中作为
代码给出了什么
标志。关键是,如果没有给出任何节标志ELF中的de>as
对于非标准(非
.text
.data
或类似)节名,将不会分配该节。请尝试将
中的(可能是)裸
.section boot\u end
指令替换为
.section boot\u end,“a”
(或更多标志,例如,使其可执行,取决于您的需要)并重试。@tofro哦,好的,我会重试。@tofro非常感谢,它确实有效。我首先尝试了
.section.boot\u end”“@progbits
,但结果相同。我再次尝试了
.section.boot\u end“a”,@progbits
,只是为了它,它工作了。问题是
a
表示可分配的节,而
。boot\u end
不是。关于我可以使用哪个标志有什么想法吗?为什么GNU as不为没有标志的自定义节生成数据?
.section boot_end 
.section boot_end,"a"