|
1: 2007-02-13 (火) 15:20:00 |
| + | *tolset [#e42b75db] |
| + | -さてtolsetである。「30日でできる!OS自作入門」(ウチのは第7刷)のCD内にあるtolsetのソールをFreeBSD上でコンパイルし、使えるようにできないものだろうか? |
| | | |
| + | -さっそくCD内からソースを持ってきた。コンパイルの実験である。 |
| + | -ディレクトリはこんな感じ。 |
| + | |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 aksa1a |
| + | drwxr-xr-x 3 lina lina 512 Nov 21 16:15 aska |
| + | drwxr-xr-x 10 lina lina 512 Nov 21 16:15 bim2bi4w |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 bim2hrb |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 bin2obj0 |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 doscmd0a |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 edimg0i |
| + | drwxr-xr-x 20 lina lina 512 Nov 21 16:15 go_0023s |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 hrblib0a |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 imgtol0d |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 makefont |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 obj2bi4c |
| + | drwxr-xr-x 2 lina lina 512 Nov 21 16:15 osalink1 |
| + | drwxr-xr-x 4 lina lina 512 Nov 21 16:15 sartol0j |
| + | drwxr-xr-x 3 lina lina 512 Nov 21 16:15 tk5lgpl1 |
| + | |
| + | **go_0023s [#va05edbb] |
| + | -さて、tolsetのコンパイルはまず、go_0023s/gcc に降りて、そこでgmakeをかます。かつ、おのおのの環境に合わせるため、そこで ../include/rules.mak を変更するという感じになる。ではさっそく・・・ |
| + | |
| + | $ cd go_0023s/gcc |
| + | $ gmake <- makeではないので注意 |
| + | -・・・書かないけど、ちょこっとだけのエラーが出てまったくできーん。そんなわけでさっそく ../include/rules.mak を修正しよ〜。rules.makはMinGWでのコンパイル用に調整されたものがあるので、コイツを雛形にして進めよう。 |
| + | |
| + | $ cp ../include/rules.mak ../include/rules.mak.org <-念のためとっておく |
| + | $ cp ../include/rules.gcc ../include/rules.mak |
| + | $ emacs ../include/rules.mak <- お好きなエディタで |
| + | |
| + | -まずはこれを修正。 |
| + | |
| + | GCC = e:\mingw\bin\gcc.exe -> GCC = gcc |
| + | MAKE = make.exe -> MAKE = gmake |
| + | LIBRARIAN = golib00.exe -> LIBRARIAN = ar rcs |
| + | DEL = del -> DEL = rm -f |
| + | |
| + | - |
| + | -さてこれでgmake! そこそこ進んで行くけど・・・こんなエラーが出て停止。 |
| + | |
| + | gcc -c -Os -DIN_GCC -DHAVE_CONFIG_H -I../include -o floatformat.o floatformat.c |
| + | In file included from floatformat.c:24: |
| + | ../include/math.h:11:20: GO_lib.h: No such file or directory |
| + | gmake[3]: *** [floatformat.o] Error 1 |
| + | |
| + | -これは、math.h内でインクルード指定しているファイル名がGO_lib.hになってるのが原因。(Win32では問題ないけど、UNIX系では大文字小文字が区別されるので) |
| + | -さてこれを修正するんだけど、こういう大文字になっちゃってるのって他にもあるんだよね。なので以下、一覧。すべて go_lib.h に書き換える。 |
| + | --../include/math.h の11行目 |
| + | --../go_lib/malloc.c の3行目 |
| + | --../go_lib/realloc.c の3行目 |
| + | --../go_lib/symalloc.c の3行目 |
| + | -さて、再びgmake。すると今度はこんなエラーが! |
| + | |
| + | gcc -Wl,-s -o cpp0.exe ../drv_stdc/cpp0main.obj cppmain.o intl.o \ |
| + | libcpp.lib hashtable.o version.o ../intl/libintl.lib \ |
| + | ../libiberty/libiberty.lib ../go_lib/go_lib.lib ../go_lib/stdin.o \ |
| + | ../drv_stdc/drv_stdc.obj |
| + | gcc: libcpp.lib: No such file or directory |
| + | gcc: ../intl/libintl.lib: No such file or directory |
| + | gcc: ../libiberty/libiberty.lib: No such file or directory |
| + | gcc: ../go_lib/go_lib.lib: No such file or directory |
| + | gmake[1]: *** [cpp0.exe] Error 1 |
| + | |
| + | -これはどういうことかって言うと、ほぼ最期までコンパイルできて、cpp0.exe を作る段階。いくつかの.objファイルと.libファイルをリンクしようとしているんだけど、その再に |
| + | --libcpp.lib |
| + | --../intl/libintl.lib |
| + | --../libiberty/libiberty.lib |
| + | --../go_lib/go_lib.lib |
| + | -というファイル達がないと言っているわけ。・・・で、なんでないかといえば、よーするにコンパイルを失敗しているんだよね。(^^; |
| + | -なんでこれら.libが失敗しているかっていうと、.libを作るためのライブラリアンと言うソフト。これがWin32だとKタンオリジナルの golib00.exe というものを使っているから。 |
| + | -gccだと、ライブラリアンは ar というコマンド。でもそれだけじゃなくて、構文も違うんだよね。 |
| + | -なので、おのおのの.libを作成している部分の構文を書き換えよう。 |
| + | -まず、今いる場所のMakefile。(libcpp.libを作るところ) |
| + | $ emacs ./Makefile |
| + | --58行目かな? |
| + | : |
| + | libcpp.lib : $(LIBCPP_OBJS) Makefile ../include/rules.mak |
| + | $(LIBRARIAN) out:$@ $(LIBCPP_OBJS) |
| + | |
| + | libbackend.lib : $(OBJS) |
| + | $(LIBRARIAN) out:$@ $(OBJS) |
| + | : |
| + | --これを、こう書き換える。 |
| + | : |
| + | libcpp.lib : $(LIBCPP_OBJS) Makefile ../include/rules.mak |
| + | $(LIBRARIAN) $@ $(LIBCPP_OBJS) |
| + | |
| + | libbackend.lib : $(OBJS) |
| + | $(LIBRARIAN) $@ $(OBJS) |
| + | : |
| + | --さてー!これでOK!! |
| + | --・・・なんだけど、ちょっと。 |
| + | --これ、元々はWin32環境用のMakefileだよね?。なので、出来上がる実行ファイルはみんな.exeってことにしてある。でも、FreeBSDとかLinux上だとちょっとイヤ〜ンだよね? |
| + | --なので、他の部分もついでに書き換え。 |
| + | : |
| + | /*46行目*/ |
| + | all : |
| + | $(MAKER) cpp0 cc1 cc1plus |
| + | |
| + | clean : |
| + | -$(DEL) cpp0 cc1 cc1plus |
| + | -$(DEL) *.lib |
| + | -$(DEL) *.o |
| + | : |
| + | : |
| + | /*64行目*/ |
| + | cpp0 : cppmain.o intl.o libcpp.lib hashtable.o version.o \ |
| + | Makefile ../include/rules.mak |
| + | : |
| + | : |
| + | /*73行目*/ |
| + | cc1 : $(C_OBJS) $(BACKEND) Makefile ../include/rules.mak |
| + | : |
| + | : |
| + | /*81行目*/ |
| + | cc1plus : $(CXX_OBJS) $(CXX_C_OBJS) $(BACKEND) libcpp.lib \ |
| + | Makefile ../include/rules.mak |
| + | |
| + | |
| + | -さて次。../libiberty/libiberty.lib のMakefile。 |
| + | $ emacs ../libiberty/Makefile |
| + | --これは一箇所。一番最後の部分を書き換える。 |
| + | $(TARGETLIB) : $(OBJS) Makefile ../include/rules.mak |
| + | $(LIBRARIAN) out:$@ $(OBJS) |
| + | ↓ |
| + | $(TARGETLIB) : $(OBJS) Makefile ../include/rules.mak |
| + | $(LIBRARIAN) $@ $(OBJS) |
| + | |
| + | |
| + | -同じパターン。../intel/Makefileも。 |
| + | こらもう書かんでも解るやろ |
| + | |
| + | -さらに ../go_lib/Makefile。 |
| + | こらもう書かんでも解るやろ |
| + | |
| + | おぉぉ! これで出来上がり〜! これで、以下はOK! |
| + | -cpp0 |
| + | -cc1 |
| + | -cc1plus |
| + | |
| + | **toolstdc [#p6b7c63f] |
| + | 次にtools。これはFreeBSD環境なので当然toolstdcだね。 |
| + | $ cd ../toolstdc |
| + | $ gmake |
| + | |
| + | -たはは。こんなエラーが。 |
| + | gcc -Wl,-s -o nask.exe nask.obj ../nasklib/nasklib.lib \ |
| + | ../go_lib/go_lib.lib ../go_lib/stdin.o |
| + | gcc: ../nasklib/nasklib.lib: No such file or directory |
| + | gmake[1]: *** [nask.exe] Error 1 |
| + | |
| + | -これはもう前回と同じパターン。../nasklib/nasklib.libがない。なんでかっていうとコンパイルできてないから。さっそく../nasklib/Makefileを編集。 |
| + | こらもう書かんでも解るやろ |
| + | |
| + | -さてgmake・・・なんだけど、ここでもやっぱり.exeになるよね。おなじくMakefileを書き換え。 |
| + | -こらもう書かんでも解るやろ・・・っと思ったけど、ちょっとアレなので載せとこう。 |
| + | include ../include/rules.mak |
| + | |
| + | all : |
| + | $(MAKER) golib00 sjisconv gas2nask nask naskcnv0 |
| + | |
| + | clean : |
| + | -$(DEL) *.obj |
| + | -$(DEL) golib00 sjisconv gas2nask nask naskcnv0 |
| + | |
| + | golib00 : golib00.obj Makefile ../include/rules.mak |
| + | $(LINK) -o $@ $@.obj |
| + | |
| + | sjisconv : sjisconv.obj Makefile ../include/rules.mak |
| + | $(LINK) -o $@ $@.obj |
| + | |
| + | gas2nask : gas2nask.obj Makefile ../include/rules.mak |
| + | $(LINK) -o $@ $@.obj |
| + | |
| + | nask : nask.obj Makefile ../include/rules.mak |
| + | $(MAKEC) ../nasklib |
| + | $(MAKEC) ../go_lib |
| + | $(LINK) -o nask nask.obj ../nasklib/nasklib.lib \ |
| + | ../go_lib/go_lib.lib ../go_lib/stdin.o |
| + | |
| + | naskcnv0 : naskcnv0.obj Makefile ../include/rules.mak |
| + | $(MAKEC) ../go_lib |
| + | $(LINK) -o naskcnv0 naskcnv0.obj ../go_lib/go_lib.lib |
| + | |
| + | これで出来上がり〜! これで、以下はOK! |
| + | -golib00 |
| + | -sjisconv |
| + | -gas2nask |
| + | -nask |
| + | -naskcnv0 |
| + | |
| + | **ASKA [#vf74888c] |
| + | さて久しぶりのアスカたん。 |
| + | |
| + | -askaのディレクトリに移動。 |
| + | $ cd ../../aska/src |
| + | -よし。一発メイク! お! やっぱりエラー。(^^; |
| + | g++ -O2 -I. -DLINUX -c main.cpp |
| + | In file included from parser.h:21, |
| + | from main.cpp:1: |
| + | module.h: In member function `void Module::Release()': |
| + | module.h:39: error: ISO C++ forbids cast to non-reference type used as lvalue |
| + | |
| + | -該当部分をみてみるとこうなっている。 |
| + | |
| + | |
| + | #ifdef WINVC |
| + | void Release(void){ DELETEPTR_SAFE(lpMdlAdr); dwMdlSize=0; lpMdlPos=\ |
| + | NULL; } |
| + | #else |
| + | void Release(void){ DELETEPTR_SAFE((unsigned char*)lpMdlAdr); dwMdlS\ |
| + | ize=0; lpMdlPos=NULL; } |
| + | #endif |
| + | |
| + | -さて。これどういうことかってーと、どうも新しいgccでは、「左辺をキャストしてはいかん!右辺でやりなされ!」ということになったらしいのでそのエラーらしいです。 |
| + | |
| + | -オイラはこれのやり方がわかりませんでしたが、キャストは最悪しなくてもいいということを信じて、型キャストをはずしてしまいました。 |
| + | |
| + | #ifdef WINVC |
| + | void Release(void){ DELETEPTR_SAFE(lpMdlAdr); dwMdlSize=0; lpMdlPos=\ |
| + | NULL; } |
| + | #else |
| + | void Release(void){ DELETEPTR_SAFE(lpMdlAdr); dwMdlS\ |
| + | ize=0; lpMdlPos=NULL; } |
| + | #endif |
| + | |
| + | -・・・なんか別の文句を言ってきてますが、とりあえずこれで進んでます。(^^; |
| + | -ええと・・これでOKです。ASKAが出来上がりました。 |
| + | |
| + | おっけ〜。これでaskaは完成。 |
| + | -aska |
| + | |
| + | |
| + | **aksa1a [#k5525793] |
| + | さてaksa1aいくぞ〜。 |
| + | -ふーむ。Makefileを見ると、これはgoでのコンパイル用のものらしい。 |
| + | -うーむ。単独の.cだし、そのままgccで当てちゃうんでいいのかな。 |
| + | $ gcc -o aksa aksa.c |
| + | -とりあえずこれでできたようだ。(実験とか出来ないかな・・・) |
| + | -むむむ!! memo.txt に書いてあるテストをやったらそのまま出てきたぞ? OKみたい!!(^^ |
| + | $ aksa helloc4.org 0 0 1 5 |
| + | file-ofs EIP |
| + | 00000000 00000000 2E 8B 62 20 ESP = (int) [CS:EDX + 0x20]; |
| + | 00000004 00000004 8B FC EDI = ESP; |
| + | 00000006 00000006 EB 20 goto 0x00000028; |
| + | 00000008 00000008 47 EDI++; |
| + | 00000009 00000009 55 PUSH(EBP); |
| + | |
| + | これでaksaはできた〜。 |
| + | -aksa |
| + | |
| + | |
| + | **まとめて一丁! [#sa35d72b] |
| + | えーと。これらはgcc一発でなんかできそうなので一気に。 |
| + | |
| + | -おのおののディレクトリに降りてやってね〜。 |
| + | $ cd bim2bi4w |
| + | $ gcc -o bim2bin bim2bin.c |
| + | |
| + | $ cd ../bim2hrb |
| + | $ gcc -o bim2hrb bim2hrb.c |
| + | |
| + | $ cd ../bin2obj0 |
| + | $ gcc -o bin2obj bin2obj.c |
| + | |
| + | $ cd makefont |
| + | $ gcc -o makefont makefont.c |
| + | |
| + | $ cd osalink1 |
| + | $ gcc -o osalink1.c osalink |
| + | |
| + | |
| + | 多分これでOKだと思います〜。 |
| + | -bim2bin |
| + | -bim2hrb |
| + | -bin2obj |
| + | -makefong |
| + | -osalink1 |
| + | |
| + | **obj2bim [#pe56ac66] |
| + | -ディレクトリに移って「あれれ?」と思った。autodec_.cとautodec.askという二つのファイルがある。 |
| + | -Makefileを見ると、obj2bimはobj2bim.objとautodec.objという二つのファイルをリンクして作られることがわかる。しかし、autodecのソースって・・・ |
| + | -以下、勝手に「多分かつてはautodecはaskaで書かれていたけれど、Cで書き直された」と予想してこんなふうにコンパイル。 |
| + | $ gcc -c -o autodec.obj autodec_.c |
| + | $ gcc -c -o obj2bim.obj obj2bim.c |
| + | $ gcc -Wl,-s -o obj2bim ./autodec.obj obj2bim.obj\ |
| + | |
| + | いちおうこれで動いてるみたい。とりあえずOKとしておこう |
| + | -obj2bim |
| + | |
| + | **edimg [#r3c6df48] |
| + | edimgはじめ〜。 |
| + | -まず、ソースであるecimg.cの頭のほう。 |
| + | //#define SAR_MODE_WIN32 1 |
| + | /* Linuxなどでは↑をコメントアウトする */ |
| + | |
| + | #define SAR_MODE_POSIX 1 |
| + | /* Windowsなどでは↑をコメントアウトする */ |
| + | |
| + | -こんな感じに修正。 |
| + | -・・・で、これもobj2bimと同じパターン。普通にやってもダメそうなので、手動で無理やり。 |
| + | $ gcc -c -o edimg.obj edimg.c |
| + | $ gcc -c -o autodec.obj autodec_.c |
| + | $ gcc -Wl,-s -o edimg ./autodec.obj edimg.obj |
| + | |
| + | -これで出来たかなぁ・・・ |
| + | |
| + | とりあえず完成〜。 |
| + | -edimg |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | **imgtol [#z507ee92] |
| + | COLOR(green){たぶんこれは「まずコンパイルできんだろうということになりそう・・・。なので出来なかったら放置で。} |
| + | |
| + | COLOR(red){たぶんこれは、とりあえずはddコマンドで代用ということに・・・} |
| + | |
| + | うわぁ・・・。これ、ソースがaskaのみだ。askaのテストになるかな??? |
| + | -つか、基本的にぜんぐgoでのコンパイルが前提だよね。 |
| + | -Makefileを参考に、手動で追ってみよう・・・ |
| + | -わー。ぜんぜんダメじゃん・・・・ |
| + | |
| + | |
| + | |
| + | |
| + | **doscmd [#bee57c3d] |
| + | COLOR(green){たぶんこれはいらないだろうということになりそう・・・。なので出来なかったら放置で。} |
| + | doscmd。えーっと。これのMakefileを見ると完全にgoなどでコンパイルすることが前提になってますなぁ・・・(^^; |
| + | -makefileを追いかけてみる。 |
| + | --.cファイルを、sjisconvを使って.caファイルに。 |
| + | --.caファイルを、goのcc1で.gasに。 |
| + | --.gasを、gas2naskを使って.nasに。 |
| + | --.nasを、naskを使って.objに。 |
| + | --できあがった.objをld.exeを使い、libmingw.lib とリンクして実行ファイル |
| + | -・・・とまあ、こういう流れだよね。これ。 |
| + | -ちょっとまった。libmingw.libって・・・・ |