なんとな~くしあわせ?の日記

ClojureとかAWSの設定とかをメモする技術ブログ

qemuをMinGWでビルド



GNU Hurdを動かすための布石として、qemuをインストールする。
参考サイト:KMC Staff Blog:MinGW 環境で QEMU 1.0.1 をビルド

以下、揃えたソフトウェアのバージョンなど
qemuってIBMとかRHの人もコミットしてるんだねえ。

learning@foxy_maiden /usr/local/src/qemu
$ uname -a
MINGW32_NT-6.1 FOXY_MAIDEN 1.0.16(0.48/3/2) 2010-09-29 00:07 i686 Msys

learning@foxy_maiden /usr/local/src/qemu
$ gcc --version
gcc.exe (GCC) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

learning@foxy_maiden /usr/local/src/qemu
$ git log -1
commit 8aca521512a14c439624191bd0a891c52f91b401
Merge: 664535c 89bfe00
Author: Anthony Liguori <aliguori@us.ibm.com>
Date:   Mon Jun 18 10:35:16 2012 -0500

learning@foxy_maiden /usr/local/src/qemu
$ python --version
Python 2.7.1

learning@foxy_maiden /usr/local/src/qemu
$ which python
/c/Python27/python.exe

あとその他に用意していたもの(以前ビルドしていて、qemuに必要そうなソース)
SDL-1.2.14
glib-2.21.0
zlib-1.2.6

エミュレートしたいCPUの種類の一覧は configure -h すれば出てきた

  --target-list=LIST       set target list (default: build everything)
                           Available targets: i386-softmmu x86_64-softmmu
                           alpha-softmmu arm-softmmu cris-softmmu lm32-softmmu
                           m68k-softmmu microblaze-softmmu microblazeel-softmmu
                           mips-softmmu mipsel-softmmu mips64-softmmu
                           mips64el-softmmu ppc-softmmu ppcemb-softmmu
                           ppc64-softmmu sh4-softmmu sh4eb-softmmu
                           sparc-softmmu sparc64-softmmu s390x-softmmu
                           xtensa-softmmu xtensaeb-softmmu

とりあえずGNU Hurdi386環境で動くとの事なので「i386-softmmu」を選択

これでconfigureは通るだろ!オラオラ
最初おまかせconfigureで設定してたらvnc-jpegがenableになっていて、どうしてもビルドできなかったのでdisableに指定

$ ./configure --prefix=/c/qemu/qemu-i386/bin --target-list=i386-softmmu --python=/c/Python27/python.exe --disable-strip --disable-vnc-jpeg

ビルド後にqemuを適当に起動してみた図
f:id:panzer-jagdironscrap1:20120916153807j:plain

GNU HurdをWindowsで動かす

まず仮想ディスクを作成する
参考:フリーのエミュレータQEMUを使おう@謎の処理系 SunOS 4.1.4 with Linux/FreeBSD

learning@foxy_maiden /c/gnu-hurd
$ /c/qemu/qemu-i386/bin/qemu-img create hd0.img 4G

次にisoファイルをダウンロードしてくる
Hurd-JP Project

learning@foxy_maiden /c/gnu-hurd
$ ls
debian-K7-hurd-i386-mini.iso  hd0.img

起動してみる

learning@foxy_maiden /c/gnu-hurd
$ /c/qemu/qemu-i386/bin/qemu-system-i386 -m 512 -hda hd0.img -cdrom debian-K7-hurd-i386-mini.iso

動きましたぜ。後は手動でディスクとかネットワークの設定をする必要がありそうだなー
f:id:panzer-jagdironscrap1:20120916170336j:plain

MonaOS-0.3.4をWindows環境(MSYS/MinGW)環境でビルド

前からビルドしたいと思っていたMonaOSに挑戦。
MonaOSのソースはクロスコンパイル前提なのでMinGWネイティブでの作業は考慮されていない、いろいろ書き換えた。

参考:LinuxのMinGWでMonaをコンパイル - Mona OS developers Wiki

起こった問題まとめ

    • mingw-prefixは「/mingw/bin/」で指定するのが正しいようだ

しかし、依存性のあるライブラリのビルドでコケる。

・問題1:Windowsの拡張子対応
/$MONA_HOME/mona/tool/t5lzma/7zip/Compress/LZMA_Alone
にて strip.exeが t5lzma.exe の容量を削る際 名前が t5lzmaになっているのでt5lzma.exeに変更
makeの際 EXEEXT='.exe'と設定することで解決

・問題2:undefined reference to '__chkstk'
/$MONA_HOME/mona/core/monaapi/Makefile
にてリンクを行うと undefined reference to '__chkstk' が起こる
gccが勝手に作るスタック確認用の関数らしい、要はchkstkというシンボルを作ったのに実装してないから怒られてる。
スタックのチェックを行わなくするオプション -mno-stack-arg-probeをつけてコンパイルし直すとリンクできる

・問題3:擬似再配置?
ld時のオプションとして「--disable-runtime-pseudo-reloc」をつける必要がある


Makefileの書き換え☆

1、g++部分
# 移動
$ cd /$MONA_HOME/mona/
# 書き換え
$ find ./ -name Makefile -print | xargs sed -i 's/$(CXX)/$(CXX) -mno-stack-arg-probe/'g
$ find ./ -name \*.inc -print | xargs sed -i 's/$(CXX)/$(CXX) -mno-stack-arg-probe/'g
# 確認
$ find ./ -name Makefile -print | xargs grep \$\(CXX\)
$ find ./ -name \*.inc -print | xargs grep \$\(CXX\)

2,gcc部分
# 書き換え
$ find ./ -name Makefile -print | xargs sed -i 's/$(CC)/$(CC) -mno-stack-arg-probe/'g
# 確認
$ find ./ -name Makefile -print | xargs grep \$\(CC\)

3,ld部分:オプションに「--disable-runtime-pseudo-reloc」を追加する
# 書き換え
$ find ./ -name Makefile -print | xargs sed -i 's/$(LD)/$(LD) --disable-runtime-pseudo-reloc/'g
# 確認
$ find ./ -name Makefile -print | xargs grep \$\(LD\)

4、bim2bin実行時に.exeがついていない問題
# 書き換え
$ find ./ -name Makefile -print | xargs sed -i 's/bim2bin in/bim2bin.exe in/'g
$ find ./ -name Makefile.mona -print | xargs sed -i 's/bim2bin in/bim2bin.exe in/'g
$ find ./ -name \*.inc -print | xargs sed -i 's/bim2bin in/bim2bin.exe in/'g

# line.219を書き換え
$ vim /usr/local/share/mona-0.3.4/mona/core/gmp/gmp-4.3.2/Makefile.mona

# 確認
$ find ./ -name Makefile -print | xargs grep 'bim2bin.exe'
$ find ./ -name \*.inc -print | xargs grep 'bim2bin.exe'

5、opensslビルド時にgccが固定値になっているため変更する
$ cd /$MONA_HOME/mona/core/openssl-1.0.0c/
$ vim Makefile
76 CROSS_COMPILE= /usr/bin/i586-mingw32msvc- をコメントアウト

いざコンパイル

$ ./configure --mingw-prefix=/mingw/bin/
$ make depend
$ EXEEXT='.exe' make
$ make install


結果から言うとやっぱダメでした。MinGWでビルドしたmona.imgをqemuで走らせると、起動直後によくわからんループが起きて止められない。