このアセンブリ ファイルを 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
ブート署名が含まれているため、残りの 2 バイトがいっぱいになります。
次のようにブートローダーを作成します。
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 を移動するにはどうすればよいですか? そして、私のブート署名はどこに消えたのですか?