Assembly 链接器脚本未按预期跳过字节
所以,我有这个汇编文件,我用GNU as汇编它,并用链接器脚本链接GNU ld 链接器脚本(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处,我希望这些孔
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"