5日目(sprintf対策)
今回はharib02fから。
その前に、このところmake runすると普通に画面は出るけどワーニングが多かった。
よく見ると、intt_screenやputfont8など、あとで追加した関数が最初のところ(void)で宣言されてなかった。
(このミスは最後まで尾を引いた)
bootpack.cを見直した上で、harib02fのものを参照して写経。
エラーが出るので見直していたら、最後に追加されているvoid putfonts8_ascのところを忘れていた。
追加してここまでは成功。
次に#include <stdio.h>を追加して、sprintf(s, "scrnx = %d", binfo->scrnx);を追加。
他にもchar s[40];が増えてたりと、よく見ると違いがある。
最初のエラーが出る。
gcc -march=i486 -m32 -nostdlib -T har.ld -fno-pic bootpack.c hankaku.c nasmfunc.o -o bootpack.hrb
In file included from bootpack.c:1:0:
/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: そのようなファイルやディレクトリはありません
#include <bits/libc-header-start.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~
これは必要なファイルをインストール。
$ sudo apt install gcc-multilib g++-multilib
もう一度make run。今度は、
/tmp/ccJ9cdjO.o: 関数 `HariMain' 内:
bootpack.c:(.text+0xc3): `sprintf' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
これがubuntuで開発している人には有名な、sprintfの問題。
わからないところはとりあえず保留し、まずはエラーを除くことに尽力したいので、他の方が作っているsprintf関数をコピペしmy_sprintf.cとして保存。
Makefileのgccのところに以下のように追加。
bootpack.hrb : bootpack.c har.ld hankaku.c my_sprintf.c nasmfunc.o Makefile # リンカスクリプト使用
gcc -march=i486 -m32 -nostdlib -T har.ld -fno-pic bootpack.c hankaku.c my_sprintf.c nasmfunc.o -o bootpack.hrb
これでワーニングはあるものの、成功した。
しかしharib02hでトラップ。
「init_screen」がいつの間にか「init_screen8」になっていて、違いに気づかずしばらく苦労した。
関数名を修正して、成功。
5日目最後のharib02iは変更点を追記したと思ったのだが、どこかでタイプミスをしたらしく、何度直してもエラーになった。
なので公式のharib02iのbootpack.cをそのまま持ってきてしまった。
するとエラーもなく、ワーニングも減って無事に実行できた。(出てくる画面に変化はない)
ずっとどこかで間違えたままになっていたようなので、以後はこれを使う。
今回参照させて頂いたサイト:
https://thinline196.hatenablog.com/entry/2018/07/05/234715
http://bttb.s1.valueserver.jp/wordpress/blog/2017/12/17/makeos-5-2/