链接器脚本不会按预期跳过字节

时间:2016-10-06 09:53:27

标签: assembly x86 ld linker-scripts objcopy

所以,我有这个汇编文件,我用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跳过这些字节?我的启动签名在哪里消失了?

1 个答案:

答案 0 :(得分:2)

你很可能错过了一个部分标志。如果您稍后在链接到ELF以获取非标准(不是as.text或类似的)部分名称时,如果没有为.data提供部分标记,那么该部分将是不在转储中分配(即objcopy默默忽略,请注意,在生成coff个文件时,这种行为会有所不同)

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

.section boot_end 
使用

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

指令

.section boot_end,"a" 

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

“a”标志使可分配部分,即告诉您在二进制文件中想要它的ldobjcopy