雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
1: 2007-02-13 (火) 15:20:00 ソース バックアップ No.1 を復元して編集
Line 1: Line 1:
 +*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って・・・・