2016-10-06 6 views
2

このアセンブリファイルは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_end0x7dfeにあり、穴はゼロで埋めると予想しますが、いいえ、boot.imgは合計55バイトです。私にとって、奇妙なことは、ファイルにブートシグネチャが含まれていないことです。 .boot_endまたはスキップされたバイトのない.text.dataです。

これらのバイトをスキップするにはどうすればよいですか?ブートシグネチャはどこにありますか?

+0

欠けている部分にはどのようなセクション名を使用しましたか、どのフラグを設定しましたか( 'に'は何を入れますか)? ELFやCOFFのどちらを使用するか、またどのようなオブジェクト形式を使用しても問題ありません。 – tofro

+0

@tofro '.boot_end'は私が紛失している部分です。私の質問に書かれているように' as 'で組み立てられました。私はELFを使用します。 – Downvoter

+0

そして、あなたはまだ 'ass'フラグが' as'コードで与えるものは何も言いませんでした。ポイントは、非標準( '.text'や' .data'などではない)のセクション名に対してELFでセクションフラグが 'as'に与えられなければ、セクションは割り当てられません。あなたの(おそらく)裸の '.section boot_end'指示文を、' .section boot_end、a "(あるいはそれ以上のフラグ、例えば必要なものに応じて実行可能にする)の' as'入力に置き換えて、もう一度やり直してみてください。 – tofro

答えて

2

セクションフラグが存在しない可能性があります。ポイントは、あとでasにセクションフラグが与えられていない場合、非標準(.textまたは.dataなどではない)セクション名のELFにリンクするとき、セクションはダンプに割り当てられません(つまり、静かに無視されます) objcopyによって、coffファイルを生成するとき、これは異なった動作をすることに注意してください)

おそらくあなた(置き換えるようにしてください)裸

.section boot_end 

.section boot_end,"a" 
とアセンブラの入力ファイルのディレクティブ

(必要なものに応じて、実行可能にするなどのために、さらにフラグを立ててください)、もう一度やり直してください。

「」フラグは、セクション割り当て可能、すなわちバイナリで、あなたがそれをしたいldobjcopyの両方を伝えるになります。

関連する問題