このアセンブリファイルは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) }
}
あなたは私がファイル. = 0x7cdfe
を行うことにより、ブートローダのために、必要に応じて正確に512バイトをしようと見ての通り
.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バイトです。私にとって、奇妙なことは、ファイルにブートシグネチャが含まれていないことです。 .boot_end
またはスキップされたバイトのない.text
と.data
です。
これらのバイトをスキップするにはどうすればよいですか?ブートシグネチャはどこにありますか?
欠けている部分にはどのようなセクション名を使用しましたか、どのフラグを設定しましたか( 'に'は何を入れますか)? ELFやCOFFのどちらを使用するか、またどのようなオブジェクト形式を使用しても問題ありません。 – tofro
@tofro '.boot_end'は私が紛失している部分です。私の質問に書かれているように' as 'で組み立てられました。私はELFを使用します。 – Downvoter
そして、あなたはまだ 'ass'フラグが' as'コードで与えるものは何も言いませんでした。ポイントは、非標準( '.text'や' .data'などではない)のセクション名に対してELFでセクションフラグが 'as'に与えられなければ、セクションは割り当てられません。あなたの(おそらく)裸の '.section boot_end'指示文を、' .section boot_end、a "(あるいはそれ以上のフラグ、例えば必要なものに応じて実行可能にする)の' as'入力に置き換えて、もう一度やり直してみてください。 – tofro