16: 2007-02-13 (火) 01:36:37 |
17: 2007-02-13 (火) 15:37:00 |
| COLOR(red){ちと仕切りなおし!古いのは[[FreeBSDではりぼて!/OLD]]に移動〜} | | COLOR(red){ちと仕切りなおし!古いのは[[FreeBSDではりぼて!/OLD]]に移動〜} |
| | | |
| + | ---- |
| + | *tolset移植 [#f7945ca6] |
| + | -まずははりぼてCDに入っているtolset(Win版)をBSDに移植。 |
| + | -[[FreeBSDではりぼて!/tolset移植]] |
| + | -移植状況 |
| + | |Winコマンド|状況|備考|h |
| + | |aksa.exe|たぶんOK|| |
| + | |aska.exe|たぶんOK|| |
| + | |bim2bin.exe|たぶんOK|| |
| + | |bim2hrb.exe|たぶんOK|| |
| + | |bin2obj.exe|たぶんOK|| |
| + | |cc1.exe|たぶんOK|| |
| + | |comcom.exe|×|ソース失念?| |
| + | |cpp0.exe|たぶんOK|| |
| + | |doscmd.exe|×|つか、いらないようだ| |
| + | |edimg.exe|たぶんOK|| |
| + | |gas2nask.exe|たぶんOK|| |
| + | |golib00.exe|たぶんOK|| |
| + | |imgtol.com|×|ddで代用可能らしい| |
| + | |ld.exe|×|gccで代用| |
| + | |make.exe|×|純正がある| |
| + | |makefont.exe|たぶんOK|| |
| + | |nask.exe|たぶんOK|| |
| + | |naskcnv0.exe|たぶんOK|| |
| + | |nothing.com|OK|つか、作った| |
| + | |obj2bim.exe|たぶんOK|| |
| + | |osalink1.exe|たぶんOK|| |
| + | |sartol.exe|×|| |
| + | |sjisconv.exe|たぶんOK|| |
| + | |t5lzma.exe|×|| |
| + | |upx.exe|×|| |
| + | |wce.exe|×|| |
| | | |
- | *tolset [#e42b75db] | |
- | -さてtolsetである。「30日でできる!OS自作入門」(ウチのは第7刷)のCD内にあるtolsetのソールをFreeBSD上でコンパイルし、使えるようにできないものだろうか? | |
| | | |
- | -さっそくCD内からソースを持ってきた。コンパイルの実験である。 | + | *1日目 [#gdbea45f] |
- | -ディレクトリはこんな感じ。 | + | -これだけコマンドが揃ったし、そろそろ実際に実験してみようかな・・・ |
- | | + | |
- | 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 | + | |
- | | + | |
- | **doscmd [#bee57c3d] | + | |
- | doscmd。えーっと。これのMakefileを見ると完全にgoなどでコンパイルすることが前提になってますなぁ・・・(^^; | + | |
- | -makefileを追いかけてみる。 | + | |
- | --.cファイルを、sjisconvを使って.caファイルに。 | + | |
- | --.caファイルを、goのcc1で.gasに。 | + | |
- | --.gasを、gas2naskを使って.nasに。 | + | |
- | --.nasを、naskを使って.objに。 | + | |
- | --できあがった.objをld.exeを使い、libmingw.lib とリンクして実行ファイル | + | |
- | -・・・とまあ、こういう流れだよね。これ。 | + | |
- | -ちょっとまった。libmingw.libって・・・・ | + | |
- | | + | |
- | **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 | + | |
- | | + | |
- | **imgtol [#z507ee92] | + | |
- | うわぁ・・・。これ、ソースがaskaのみだ。askaのテストになるかな??? | + | |
- | -つか、基本的にぜんぐgoでのコンパイルが前提だよね。 | + | |
- | -Makefileを参考に、手動で追ってみよう・・・ | + | |
- | -わー。ぜんぜんダメじゃん・・・・ | + | |