3日目(C言語の壁)
本書の内容よりも、Ubuntu上でどうC言語を扱って進めていくかの問題になる。
ホームのtolsetフォルダに、HariboteOS/projects/03_dayのharib00iをコピー。
harib00iから、asmhead.nasとbootpack.cをコピーしてきて中身を確認。
Ubuntu上でC言語を使うために、リンカスクリプトというのが必要なため、他の方のを参照して作成(har.ld)。
内容はほぼコピペ。
---
/* https://qiita.com/pollenjp/items/8fcb9573cdf2dc6e2668 */
OUTPUT_FORMAT(binary)
OUTPUT_ARCH(i386)
SECTIONS {
. = 0x7c00;
.text : { *(.text) }
}
---
Makefileもコピペに近いが、後でエラーが出て修正するので、最後に書く。
ここでとうとうharibote.nasはやめ、harib00iからコピーしてきたamshead.nasをそのまま使った。
しかしエラーになった。
主要な内容はこんな感じ。
$ make run
nasm asmhead.nas -o asmhead.bin -l asmhead.lst
asmhead.nas:58: error: unrecognised directive [INSTRSET]
Makefile:11: recipe for target 'asmhead.bin' failed
原因は、asmhead.nasをnasmコマンド用に編集する必要があった。
以下の箇所はいらないので、削除かコメントアウト。
[INSTRSET "i486p"] ; 486の命令まで使いたい
という記述
ついでに前と同じように、RESBのところはTIMESとDB 0に書き換え。
まだワーニングが出るので、
ALIGNB 16
を
ALIGNB 16, DB 0
に書き換えた。必須ではないかもしれない。
だがまだ
bootpack.c:(.text+0x9): `_GLOBAL_OFFSET_TABLE_' に対する定義されていない参照です
と言うエラーが出た。
これはMakefile中のgccコマンドに-fno-picというオプションを追加して修正できた。
これでmake runして黒画面、成功。
あともう少し、今度はharibot00j/naskfunc.nasをコピーしてくる。
HLT処理はC言語で生成できないので、アセンブラで関数を定義。
nasmfunc.nas
---
; naskfunc
; TAB=4
section .text
GLOBAL io_hlt
io_hlt: ; void io_hlt(void);
HLT
RET
---
bootpack.cも編集。
---
// bootpack.c
externvoidio_hlt(void);
voidHariMain(void)
{
fin:
io_hlt();
goto fin;
}
---
make runでまたエラー。
make[2]: *** 'nasmfunc.o' に必要なターゲット 'nasmfunc.nas' を make するルールがありません. 中止.
これはファイル名がオリジナルのnaskfunc.nasという名前のままになっていただけ。
Makefileの記載通りnasmfunc.nasという名前に変更して、今度こそ黒画面が起動して成功。
Makefile最終
---
# ファイル生成規則
default:
make img
ipl.bin : ipl.nas Makefile
nasm ipl.nas -o ipl.bin -l ipl.lst
asmhead.bin : asmhead.nas Makefile
nasm asmhead.nas -o asmhead.bin -l asmhead.lst
nasmfunc.o : nasmfunc.nas Makefile # nasmfunc.nasのバイナリファイル作成
nasm -g -f elf nasmfunc.nas -o nasmfunc.o
bootpack.hrb : bootpack.c har.ld nasmfunc.o Makefile # リンカスクリプトを使用
gcc -march=i486 -m32 -nostdlib -T har.ld -g -fno-pic bootpack.c nasmfunc.o -o bootpack.hrb
haribote.sys : asmhead.bin bootpack.hrb Makefile
cat asmhead.bin bootpack.hrb > haribote.sys
haribote.img : ipl.bin haribote.sys Makefile
mformat -f 1440 -C -B ipl.bin -i haribote.img ::
mcopy haribote.sys -i haribote.img ::
# コマンド
asm :
make -r ipl.bin
img :
make -r haribote.img
run :
make img
qemu-system-i386 -fda haribote.img # -fda追加
clean :
rm *.lst *.bin *.sys *.img *.hrb *.o
---
ファイルが大量になるので、cleanコマンドを使えるようにした。
ようやく三日目が完了。
今回参照させて頂いたサイト:
https://qiita.com/pollenjp/items/8fcb9573cdf2dc6e2668
https://vanya.jp.net/os/haribote.html
http://www.ertl.jp/~takayuki/readings/c/no09.html
http://hrb.osask.jp/wiki/?tools/nask
https://github.com/harrybotter30/haribote/blob/master/doc/harib00i.md#haribotehrb-%E3%81%AE%E4%BD%9C%E6%88%90