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

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

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/