ld --oformat binary
迅速で汚いテストのためにあなたはすることができます:
as -o a.o a.S
ld --oformat binary -o a.out a.o
hd a.out
与える:
00000000 90 90 |..|
00000002
残念ながら、これは警告を出します:
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400000
これは、ではあまり意味がありませんbinary
。それは次のように沈黙させることができます:
.section .text
.globl start
start:
nop
nop
と:
ld -e start --oformat binary -o a.out a.o
または単に:
ld -e 0 --oformat binary -o a.out a.o
これはld
、エントリポイントが_start
アドレスのコードではないことを示しています0
。
stdin/stdoutからinput/ouptutを取得することも、取得することas
もできないので、配管がないのは残念です。ld
適切なブートセクター
もっと深刻なことに取り組む場合、最善の方法は、クリーンで最小限のリンカースクリプトを生成することです。linker.ld
:
SECTIONS
{
. = 0x7c00;
.text :
{
*(.*)
. = 0x1FE;
SHORT(0xAA55)
}
}
ここでは、リンカースクリプトを使用してマジックバイトも配置します。
リンカスクリプトは、再配置後に出力アドレスを制御するために何よりも重要です。再配置の詳細については、https ://stackoverflow.com/a/30507725/895245をご覧ください。
次のように使用します。
as -o a.o a.S
ld --oformat binary -o a.img -T linker.ld a.o
そして、次のように起動できます。
qemu-system-i386 -hda a.img
このリポジトリでの実例:https ://github.com/cirosantilli/x86-bare-metal-examples/blob/d217b180be4220a0b4a453f31275d38e697a99e0/Makefile
Binutils 2.24、Ubuntu14.04でテスト済み。