雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
tolset
- さて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
- さて、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上だとちょっとイヤ〜ンだよね?
- それに、純正のgcc内に同じ名前のコマンドがあったりする。これは混乱の元!
- なので、他の部分もついでに書き換え。
: /*46行目*/ all : $(MAKER) gocpp0 gocc1 gocc1plus clean : -$(DEL) gocpp0 gocc1 gocc1plus -$(DEL) *.lib -$(DEL) *.o : : /*64行目*/ gocpp0 : cppmain.o intl.o libcpp.lib hashtable.o version.o \ Makefile ../include/rules.mak : : /*73行目*/ gocc1 : $(C_OBJS) $(BACKEND) Makefile ../include/rules.mak : : /*81行目*/ gocc1plus : $(CXX_OBJS) $(CXX_C_OBJS) $(BACKEND) libcpp.lib \ Makefile ../include/rules.mak
- 58行目かな?
- さて次。../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
次に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
さて久しぶりのアスカたん。
- 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
さて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
まとめて一丁!
えーと。これらは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
- ディレクトリに移って「あれれ?」と思った。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
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
t5lzma
- うーーーん・・・これ、なにをどうすればいいのかな・・・。なんかソースがどれでどこにあるのかよーわからん・・・・
- とにもかくにも掘り出したら7Zip/Compress/LZMA_Alone内に唯一Makefileがあるなぁ。これを元にやればいいのかな???
imgtol
たぶんこれは「まずコンパイルできんだろうということになりそう・・・。なので出来なかったら放置で。
たぶんこれは、とりあえずはddコマンドで代用ということに・・・
うわぁ・・・。これ、ソースがaskaのみだ。askaのテストになるかな???
- つか、基本的にぜんぐgoでのコンパイルが前提だよね。
- Makefileを参考に、手動で追ってみよう・・・
- わー。ぜんぜんダメじゃん・・・・
doscmd
たぶんこれはいらないだろうということになりそう・・・。なので出来なかったら放置で。 doscmd。えーっと。これのMakefileを見ると完全にgoなどでコンパイルすることが前提になってますなぁ・・・(^^;
- makefileを追いかけてみる。
- .cファイルを、sjisconvを使って.caファイルに。
- .caファイルを、goのcc1で.gasに。
- .gasを、gas2naskを使って.nasに。
- .nasを、naskを使って.objに。
- できあがった.objをld.exeを使い、libmingw.lib とリンクして実行ファイル
- ・・・とまあ、こういう流れだよね。これ。
- ちょっとまった。libmingw.libって・・・・
最終更新: 2024-01-06 (土) 22:39:10 (JST) (111d) by