链接器脚本未按预期跳过字节
Linker Script Does Not Skip Bytes As Expected
所以,我有这个汇编文件,我 assemble 使用 GNU as 和 link 使用 GNU ld 使用 linker 脚本。
链接描述文件(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 以跳过这些字节?我的引导签名去哪儿了?
您很可能缺少节标志。要点是,如果稍后为非标准(不是 .text
或 .data
等)节名称链接到 ELF 时,如果没有给 as
节标志,该节将未在转储中分配(即,被 objcopy
默默忽略,请注意,这在生成 coff
文件时表现不同)
尝试更换您的(大概)裸体
.section boot_end
汇编器输入文件中的指令
.section boot_end,"a"
(或更多标志,例如使其可执行,具体取决于您的需要)并重试。
"a" 标志使部分 可分配 ,即告诉 ld
和 objcopy
你想要它在你的二进制文件中。
所以,我有这个汇编文件,我 assemble 使用 GNU as 和 link 使用 GNU ld 使用 linker 脚本。
链接描述文件(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 以跳过这些字节?我的引导签名去哪儿了?
您很可能缺少节标志。要点是,如果稍后为非标准(不是 .text
或 .data
等)节名称链接到 ELF 时,如果没有给 as
节标志,该节将未在转储中分配(即,被 objcopy
默默忽略,请注意,这在生成 coff
文件时表现不同)
尝试更换您的(大概)裸体
.section boot_end
汇编器输入文件中的指令
.section boot_end,"a"
(或更多标志,例如使其可执行,具体取决于您的需要)并重试。
"a" 标志使部分 可分配 ,即告诉 ld
和 objcopy
你想要它在你的二进制文件中。