6日目(bootpack.cとMakefileの整理)
Makefileは独自のルールでやってきたので、いざbootpack.cを分割すると言われると対応に混乱するが、手順は本書の通りに進める。
とにかくbootpack.cを分ける。
bootpack.h:ヘッダファイル
graphic.c : 画面表示
dsctbl.c: descriptor table関係
bootpack.c: それ以外
しかしmake runするとどうしてもgccでエラーが出る。
dsctbl.o: 関数 `init_gdtidt' 内:
dsctbl.c:(.text+0x8c): `load_gdtr' に対する定義されていない参照です
dsctbl.c:(.text+0xd5): `load_idtr' に対する定義されていない参照です
というような感じ。関数のところはいろいろ。
他の方のMakefileを見ながら、改めて整理。
結局原因はMakefileやdsctbl.cではなく、nasmfunc.nasに増えた関数を記載忘れ&ミスタイプしてただけだった。
nasmfunc.nasの一部抜粋。
section .textのところに追加。
GLOBAL load_gdtr
GLOBAL load_idtr
GLOBAL asm_inthandler21
GLOBAL asm_inthandler27
GLOBAL asm_inthandler2c
EXTERN inthandler21
EXTERN inthandler27
EXTERN inthandler2c
(以下略)
関数は上記だけでなく、かなり行が増えているのに注意。
ついでに以下、現状のMakefileの内容。ファイル名も一部変更。
---
# 6日目終了 現在のファイル
# Makefile (このファイル)
# bootpack.c (分割後)
# dsctbl.c
# graphic.c
# bootpack.h (Makefileに記載はない)
# har.ld (リンカファイル)
# hankaku.c (半角フォント)
# my_sprintf.c (sprintf関数)
# haribote.nas
# nasmfunc.nas
# nasmhead.nas
# ipl.nas
# int.c
# デフォルト動作
default:
make img
# ファイル生成規則
nasmhead.bin : nasmhead.nas
nasm nasmhead.nas -o nasmhead.bin -l nasmhead.lst
nasmfunc.o : nasmfunc.nas # nasmfunc.nasのバイナリファイル
nasm -g -f elf nasmfunc.nas -o nasmfunc.o
bootpack.bin: bootpack.o hankaku.o nasmfunc.o my_sprintf.o dsctbl.o graphic.o int.o
ld -m elf_i386 -e HariMain -o bootpack.bin -T har.ld bootpack.o graphic.o dsctbl.o hankaku.o nasmfunc.o my_sprintf.o int.o
haribote.sys : nasmhead.bin bootpack.bin
cat nasmhead.bin bootpack.bin > haribote.sys
ipl.bin : ipl.nas Makefile
nasm ipl.nas -o ipl.bin -l ipl.lst
haribote.img : ipl.bin haribote.sys #最終的なimgファイル
mformat -f 1440 -C -B ipl.bin -i haribote.img ::
mcopy haribote.sys -i haribote.img ::
# bootpack.hrb : bootpack.c har.ld nasmfunc.o Makefile # リンカスクリプト使用
# gcc -march=i486 -m32 -nostdlib -T har.ld -fno-pic bootpack.c hankaku.c nasmfunc.o -o bootpack.hrb
%.o: %.c
gcc -c -m32 -fno-pic -nostdlib -o $*.o $*.c
# コマンド
hankaku : # conv_hankaku.cでhankaku.cを作る
gcc -o conv_hankaku conv_hankaku.c
./conv_hankaku
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
---
これは他の方のブログでまとめられた内容がとても役にたった。
「%.o: %.c」のところが最初わからなかったが、調べたところ、
---
サフィックスルール
また,C言語では必ず.cから.oファイルが作られる,ということを利用し, これをルール化したのがサフィックスルールである.サフィックスとは拡張子のことです..c.o: というターゲットは,.oというファイルが必要になれば,これを.cからつくる というルールである.自動変数である $< をつかっている.
---
と、いうことだった。
Ubuntu上で作業していると、Makefileは本書とは多少離れて対応する必要がある。
無理せず、自分が解りやすい範囲の記述でまとめた。
make runには成功したが、肝心の6日目後半の内容は正直全く理解できなかったので、少し進めてまた戻って読むのを繰り返すことにする。
今回参照させて頂いたサイト:
https://qiita.com/lrf141/items/9ba070a2a1c3e5faf71c
http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile
https://github.com/harrybotter30/haribote/blob/master/doc/chapter6.md
https://inakadeikinaosu.com/shumi/os_nyumon_13/
http://bttb.s1.valueserver.jp/wordpress/blog/2017/12/21/makeos-6-1/