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