ねこめもmkII(マークツー)

本家ねこめも (http://nekomemo2.site)の補助用。 主に勉強ネタ。

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として保存。
Makefilegccのところに以下のように追加。 

 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/