13: 2007-02-11 (日) 22:07:31 |
14: 2007-02-12 (月) 22:08:42 |
| | | |
| -あっさりOK。つまり、qemuはOKというわけだ! | | -あっさりOK。つまり、qemuはOKというわけだ! |
- | *tolset [#ucfdd0dd] | |
- | さて、それではtolset。こいつらがちゃんと動いてくれるか? ダメなら移植作業がいるよね? | |
- | ~ | |
- | ・・・ま、どっちみちメイクが通らないことにはどうしようもないわけで、とにもかくにもまず、メイクを全ツールで通そうじゃないか。 | |
| | | |
- | たぶん完了〜。 | + | COLOR(red){ちと仕切りなおし!古いのは[[FreeBSDではりぼて!/OLD]]に移動〜} |
- | #ls2(FreeBSDではりぼて!/,) | + | |
| | | |
- | まだまだ! | |
| | | |
- | **doscmd01 [#nfdc42e4] | + | *tolset [#e42b75db] |
- | こいつはいろいろとtolsetがいる。他のヤツが完成してからでないとなぁ・・・ | + | -さてtolsetである。「30日でできる!OS自作入門」(ウチのは第7刷)のCD内にあるtolsetのソールをFreeBSD上でコンパイルし、使えるようにできないものだろうか? |
| | | |
- | **edimg [#g8f43e14] | + | -さっそく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_0023 [#n44af228] | + | **go_0023s [#va05edbb] |
- | -ふむふむ〜。まずはrules.makの調整からだね。ええと、FreeBSDでうまくいくかな??? | + | -さて、tolsetのコンパイルはまず、go_0023s/gcc に降りて、そこでgmakeをかます。かつ、おのおのの環境に合わせるため、そこで ../include/rules.mak を変更するという感じになる。ではさっそく・・・ |
- | -まず、include内のrules.makをrules.mak.orgに変名してとっておく。 | + | |
- | -おなじinclude内のrules.gccをrules.makにコピー。こっちを雛形にしていこう。 | + | |
- | -・・・おぉっとぉ! 待った待った! golibやらnaskやら、細かいのを先に作っておかないといけないみたいだなぁ。これ。 | + | |
| | | |
- | ***gcc [#kbfefa23] | + | $ cd go_0023s/gcc |
- | -ここも単独でコンパイルできないものかなぁ・・・ | + | $ gmake <- makeではないので注意 |
- | -Makefileを見ると、ここでは cpp0、cc1、cc1plus を生成するみたい。 | + | -・・・書かないけど、ちょこっとだけのエラーが出てまったくできーん。そんなわけでさっそく ../include/rules.mak を修正しよ〜。rules.makはMinGWでのコンパイル用に調整されたものがあるので、コイツを雛形にして進めよう。 |
- | -たとえばまず、cpp0.exeだけ作れないものか・・・ | + | |
- | -とにもかくにも、cppmain.o intl.o libcpp.lib hashtable.o version.o が必要みたいだ。これらを単独でコンパイルしてみよう・・・ | + | |
- | -だめだ・・・。猛烈なエラーを吐いて停止した・・・ | + | |
| | | |
| + | $ 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) |
| | | |
- | ***toolstdc [#uc16ed9c] | + | libbackend.lib : $(OBJS) |
- | -stdcは多分、できるだけWin32の機能に依存しないようにつくられたバージョン。なので、コイツから作る。 | + | $(LIBRARIAN) out:$@ $(OBJS) |
| + | : |
| + | --これを、こう書き換える。 |
| + | : |
| + | libcpp.lib : $(LIBCPP_OBJS) Makefile ../include/rules.mak |
| + | $(LIBRARIAN) $@ $(LIBCPP_OBJS) |
| | | |
- | -toolstdcに降りてメイク。当然エラーがでる。(^^ さーて・・・ | + | libbackend.lib : $(OBJS) |
- | -くっそぉ! なんでだろう? nasklibがコンパイルできない。 | + | $(LIBRARIAN) $@ $(OBJS) |
- | ../toolstdc/golib00 out:nasklib.lib ll.o ll_lib.o nask.o | + | : |
- | unknown file type: ll.o | + | --さてー!これでOK!! |
- | -なんだろう。これ? もしかして、ll.oの形式が問題なのかな??? | + | --・・・なんだけど、ちょっと。 |
- | -たしか、.oって「オブジェクトファイル」と言われ、最終コンパイルの前の中間ファイルだったよなぁ。 | + | --これ、元々はWin32環境用のMakefileだよね?。なので、出来上がる実行ファイルはみんな.exeってことにしてある。でも、FreeBSDとかLinux上だとちょっとイヤ〜ンだよね? |
- | -外で宣言されている関数とかそういうのを後回し(未コンパイル?)にし、また、他のobj等のファイルとくっつけるための「のりしろ」を持っている中間ファイル。 | + | --なので、他の部分もついでに書き換え。 |
- | -これをライブラリアンであるgolib00でまとめているはずなんだけど、そのgolib00がunknounを吐く。 | + | : |
- | gcc -c -Os -DIN_GCC -DHAVE_CONFIG_H -I../include -o ll.o ll.c | + | /*46行目*/ |
- | gcc -c -Os -DIN_GCC -DHAVE_CONFIG_H -I../include -o ll_lib.o ll_lib.c | + | all : |
- | gcc -c -Os -DIN_GCC -DHAVE_CONFIG_H -I../include -o nask.o nask.c | + | $(MAKER) cpp0 cc1 cc1plus |
- | -FreeBSD上では、各.cファイルはこんなオプションで.o形式にされている。これらのオプションに問題があるのかな??? | + | |
- | -・・・おそらくnaskが「BINとCOFF(実際はwin32-COFF)」しか吐けないことを考えると、golib00もこれらしか扱えないのではないかと予測。さらに、普通のGCCはたぶんELFとかa.out形式が標準のはず。たぶんこれのズレではないだろうか? | + | |
- | -まいったなぁ。.oファイルの形式を調査したりする方法やGCCで他の形式のオブジェクトファイルを吐き出す方法がわからない・・・どうすれがえぇんだろ?? | + | |
- | -おぉぉ! 形式を判定できるぞ! UNIX系では、 「file」というコマンドでできるのか!よし!!さっそく! | + | |
| | | |
- | $> file ./ll.o | + | clean : |
- | ./ll.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (FreeBSD), not stripped | + | -$(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 |
| | | |
- | -おぉ!出た!ふむふむ! 間違いなくELF形式だということは解ったぞ! | |
- | -まてよぉ??。gccって、コンパイルする段階でCOFFとかのサポートを持たせたりはずしたりできるのか?もしかして?。 | |
- | -しかも、なんだかFreeBSDのパッケージで用意されているgcc3.4は、そのスイッチがはずされている(つまりCOFFとかをサポートしていない)ってことなのか?? | |
- | -もしそうなら、gccを自分で再コンパイルすればWinCOFF形式の.oを作れるってことかな??? | |
| | | |
| + | -さて次。../libiberty/libiberty.lib のMakefile。 |
| + | $ emacs ../libiberty/Makefile |
| + | --これは一箇所。一番最後の部分を書き換える。 |
| + | $(TARGETLIB) : $(OBJS) Makefile ../include/rules.mak |
| + | $(LIBRARIAN) out:$@ $(OBJS) |
| + | ↓ |
| + | $(TARGETLIB) : $(OBJS) Makefile ../include/rules.mak |
| + | $(LIBRARIAN) $@ $(OBJS) |
| | | |
- | -ちょっと実験。とりあえず現在の状態でもライブラリアンそのものはあり、動く。arコマンドがそうだ。ちょっと試しにarを使ってnasklib.libを作ってみよう。 | |
| | | |
- | gcc -c -o ll.o ll.c | + | -同じパターン。../intel/Makefileも。 |
- | gcc -c -o ll_lib.o ll_lib.c | + | こらもう書かんでも解るやろ |
- | gcc -c -o nask.o nask.c | + | |
- | ar rcs nasklib.lib ll.o ll_lib.o nask.o | + | |
| | | |
- | -これで、とにもかくにもnasklib.libは出来上がった。・・・たぶんこれじゃダメだろうけどね。 | + | -さらに ../go_lib/Makefile。 |
- | -さて問題。で、出来上がったnasklib.libがなぜダメで、どうなっていればいいのか?。さっそく調査・・・ | + | こらもう書かんでも解るやろ |
| | | |
- | -・・・っていうか、もしかして勘違いかな???。だって、ここの処理はそもそも、nask.exeを作るためのもの。今回はFreeBSD上で動作する実行ファイルを作りたいわけでしょ?。そのためにnasklib.libやgo_lib.libを作るわけでしょ? だとすると、そもそもこれらlibがCOFFである必要性ってあるのかな??? | + | おぉぉ! これで出来上がり〜! これで、以下はOK! |
- | -そんなわけで、いずれにしてもnask.exeの作成には nasklib.lig と go_lib.lib 、stiin.libが必要だよね。まずはそっちから手をつけてみよう。 | + | -cpp0 |
- | ***go_lib [#xee770c1] | + | -cc1 |
- | -ふむ・・・ここにはズラーっと.cファイルがあるな。よし。とりあえず、ぜーんぶ gcc -c xxx.o xxx.c のパターンでコンパイル・・・ | + | -cc1plus |
- | -あっちゃぁ〜。またエラーが! | + | |
- | abort.c: In function `GO_abort': | + | |
- | abort.c:7: error: `GO_TERM_ABORT' undeclared (first use in this function) | + | |
- | abort.c:7: error: (Each undeclared identifier is reported only once | + | |
- | abort.c:7: error: for each function it appears in.) | + | |
- | -やっと突き止めた。なぜかabort.c内ではまったく宣言されていない定数 GO_TERM_ABORT が使われている。 | + | |
- | -じゃあどこかっていうと、 ../include/go_lib.h内じゃん。じゃあ、#include "../include/go_lib.h"を追加と・・・ | + | |
- | -できたー! | + | |
- | -別件が発生。 | + | |
- | gcc -c -o vfprintf.o vfprintf.c | + | |
- | vfprintf.c:9: error: syntax error before '*' token | + | |
- | vfprintf.c: In function `GO_vfprintf': | + | |
- | vfprintf.c:14: error: `format' undeclared (first use in this function) | + | |
- | vfprintf.c:14: error: (Each undeclared identifier is reported only once | + | |
- | vfprintf.c:14: error: for each function it appears in.) | + | |
- | vfprintf.c:14: error: `arg' undeclared (first use in this function) | + | |
- | vfprintf.c:15: error: `stream' undeclared (first use in this function) | + | |
| | | |
- | -むむむむ・・・どこが間違いなんだろう? まさか、askaの時に出る型キャストの関係か!? | + | **toolstdc [#p6b7c63f] |
- | vfprintf.cの9行目 | + | 次にtools。これはFreeBSD環境なので当然toolstdcだね。 |
- | int GO_vfprintf(GO_FILE *stream, const char *format, va_list arg) | + | $ 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 |
| | | |
- | *imgtol0d [#a8a019ec] | + | sjisconv : sjisconv.obj Makefile ../include/rules.mak |
- | *osalink1 [#y9c62766] | + | $(LINK) -o $@ $@.obj |
- | *sartol0j [#k7fd4342] | + | |
- | -???。それに、sargow32.libって・・・・ | + | |
- | *hrblib0a [#pffff331] | + | |
- | -??? | + | |
- | *obj2bi4c [#g0283147] | + | |
- | -これはaskaがいるらしい。後で・・・ | + | |
- | -ふむ・・・ここはMakefileがあまりシャキンとしてないや。com_mak.txtを見てと・・・ | + | |
- | -ええと、.askファイルのコンパイル方法は | + | |
- | --*.askを cpp0.exe -P -I$(INCPATH) を使って*.iasにする。 | + | |
- | --*.iasを、 ASKA を使って*.3asにする。 | + | |
- | --*.3asを、 naskcnv0.exe -l -s -w を使って*.nasにする。 | + | |
- | --*.nasを、 nask.exe を使って*.objファイルにする。 | + | |
| | | |
- | -とまあ、こういう流れになるわけか。 | + | gas2nask : gas2nask.obj Makefile ../include/rules.mak |
- | -cpp0かぁ。これ、なにするコマンドだっけ? gccだとええと・・・ | + | $(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] |
| + | さて久しぶりのアスカたん。 |
| | | |
- | *tk5lgpl1 [#h56285e8] | + | -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 |