雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。

tolset anchor.png Edit

  • さて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
Page Top

go_0023s anchor.png Edit

  • さて、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
  • さて次。../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
Page Top

toolstdc anchor.png Edit

次に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
Page Top

ASKA anchor.png Edit

さて久しぶりのアスカたん。

  • 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
Page Top

aksa1a anchor.png Edit

さて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
Page Top

まとめて一丁! anchor.png Edit

えーと。これらは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
Page Top

obj2bim anchor.png Edit

  • ディレクトリに移って「あれれ?」と思った。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
Page Top

edimg anchor.png Edit

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
Page Top

t5lzma anchor.png Edit

  • うーーーん・・・これ、なにをどうすればいいのかな・・・。なんかソースがどれでどこにあるのかよーわからん・・・・
  • とにもかくにも掘り出したら7Zip/Compress/LZMA_Alone内に唯一Makefileがあるなぁ。これを元にやればいいのかな???
Page Top

imgtol anchor.png Edit

たぶんこれは「まずコンパイルできんだろうということになりそう・・・。なので出来なかったら放置で。

たぶんこれは、とりあえずはddコマンドで代用ということに・・・

うわぁ・・・。これ、ソースがaskaのみだ。askaのテストになるかな???

  • つか、基本的にぜんぐgoでのコンパイルが前提だよね。
  • Makefileを参考に、手動で追ってみよう・・・
  • わー。ぜんぜんダメじゃん・・・・
Page Top

doscmd anchor.png Edit

たぶんこれはいらないだろうということになりそう・・・。なので出来なかったら放置で。 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