21日目(C言語でアプリケーション)
かなり時間が経っているが、引き続きやっていることをメモする。
正直やりたいことがだいたい終わってるし他にやりたいことがたくさんあるので、ここから先は進めるかどうか悩んでいる。
C言語がわかっていないのでかなり厳しいが、今のところやれるところまでやっておくことにする。
harib18aでconsole.cの編集。0xfec は使ったので、oxfe8を使う。
それはいいんだが、本書と環境が違うため、Makefileの編集がかなり難しくなってきた。
hello2の時は、作ったアプリを手動でhrbファイルにしてから、
$ nasm hello2.nas -o hello2.hrb
でhello2.hrbを作ってあること前提で、Makefikeに
haribote.img : ipl10.bin haribote.sys hello2.hrb #最終的なimgファイル
mformat -f 1440 -C -B ipl10.bin -i haribote.img ::
mcopy -i haribote.img haribote.sys ::
mcopy -i haribote.img hello2.hrb ::
と、書き加えておいた。
ここまでは良かった(?)けど、harib18bでものすごくつまづいた。
本文の内容そのものではなく、自分の環境でC言語のアプリケーションをコンパイルする方法が全然わからなかった。
でも結局、いつも参照させてもらっているブログに詳細が書いてあったので、ほぼそのままで実行することができた。
やっていることは参照先そのままだが、一応書いておく。
a.cファイルは本書そのままで作成する。
a_nasm.asmの方はnasmに合わせて修正する。(参照先を見たほうが早いです)
リンカファイルも準備しておく。参照先通りに作成すると、ファイル名はapi.ls。
その後コマンドで.oファイルに変換。
$ gcc -fno-pic -c -m32 -o a.o a.c
$ nasm -f elf32 -o a_nasm.o a_nasm.asmapi.ls
ファイルをリンク。
$ ld -m elf_i386 -e HariMain -o a.hrb -Tapi.ls a_nasm.o a.o
最初、gccで「-fno-pic」を付けなくてエラーが出る罠にハマった。
エラーはリンク時で出てくるので、解りづらい。
$ ld -m elf_i386 -e HariMain -o a.hrb -Tapi.ls a_nasm.o a.o
a.o: 関数 `HariMain' 内:
a.c:(.text+0xd): `_GLOBAL_OFFSET_TABLE_' に対する定義されていない参照です
付ければエラーはすぐ出なくなった。
その後にimgファイルを作成、手動で起動。
$ make img
$ qemu-system-i386 -m 32 -fda haribote.img -enable-kvm
この時点では、アプリケーションaはまともに動いてくれない。
ここでa.hrbの最初の6バイトを書き換える。
$ ghex a.hrb
「e8 16 00 00 00 cb」に変更。
haribote.imgを一旦消してimgファイルを作り直してからもう一度起動すると、aが動くようになった。
$ rm haribote.img
$ make img
$ qemu-system-i386 -m 32 -fda haribote.img -enable-kvm
これを確認してから、最後にまたconsole.cを編集し、新しく作成したhello.cファイルも動くことを確認。
ここまでで力尽きたので、21日目はまだ続く予定。
今回参照させて頂いたサイト:
http://bttb.s1.valueserver.jp/wordpress/blog/2018/02/23/makeos-21/
https://vanya.jp.net/os/haribote.html