雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
13: 2007-02-11 (日) 22:07:31 ソース バックアップ No.13 を復元して編集 14: 2007-02-12 (月) 22:08:42 ソース バックアップ No.14 を復元して編集
Line 11: Line 11:
-あっさり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」というコマンドでできるのか!よし!!さっそく!+
- $&gt; file ./ll.o + clean : 
- ./ll.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (FreeBSD), not stripped+       -$(DEL) cpp0 cc1 cc1plus 
 +&nbsp;       -$(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