Vine Linux 4.0用Wine 0.9.30のソースRPM
Vine Linux 4.0用のWine 0.9.30のソースRPMを作ってみた。
ブラウザの右クリックかwgetで保存出来る。(でないとRealMedia扱いされる)
wine-0.9.30-spr1.src.rpm
Wine 0.9.30がリリース
Wine 0.9.30が少し前にリリースしてたので、FreeBSD 6.2とVine Linux 4.0で試してみた。
FreeBSD 6.2は0.9.24、Vine Linux 4.0は0.9.22からバージョンアップした。
どちらもwinecfgは無事起動。
一通り動かしてみたが、どちらも3Dピンボールだけ動かなかった。
しばらくはこのバージョンで様子見してみる。
以前は動いていた3Dピンボール
libmのpow()関数を高速化改造する
FreeBSDのpow()関数とpowf()関数(べき乗)がとてつもなく動作が遅い事に気が付いた。
ひたすらpow()するだけのプログラムのFreeBSD版とLinux版を用意してFreeBSDで両方を動かしてみると、何故かLinux版の方が速い。
しかもFreeBSD版は倍の時間が掛かる。
/* * コンパイルは「gcc hoge.c -lm」とやる。 */ #include#include int main() { double i, j, k = 0; for (i = 0.0001; i <= 0.2; i += 0.0001) for (j = 0.0001; j <= 0.2; j += 0.0001) k += pow(i, j); printf("%f\n", k); }
何で遅いのかソースファイルを探してみると、該当ソースは/usr/src/lib/msun/srcにあるe_pow.cとe_powf.cと分かる。
FreeBSDのpow()関数はC言語で書いてあるが、glibcのソースを見てみると、こっちはpow()関数をアセンブラで(浮動小数演算命令を使って)書いてある。
ここでかなり差が出てると思われるので、glibcのソースをFreeBSDにマージして高速化してみる。
以下作業手順
続きを読むFreeBSDでglibcをクロスコンパイル
FreeBSDでglibcをクロスコンパイル出来たのでメモ。
コンパイル出来たけど使い道が思いつかない…
クロスコンパイルにはPortsのemulators/linux_dist-gentoo-stage3を使う。
ターゲットはLinux。
クロスコンパイルの手順
★ソースの用意
バージョン2.3.6ならコンパイル出来たので、このバージョンのソースを用意する。
適当なミラーからglibc-2.3.6.tar.bz2とglibc-linuxthreads-2.3.6.tar.bz2をダウンロードする。
★ファイルの展開
作業ディレクトリに移動してglibcのソースを展開する。
さらに、展開されたglibcのディレクトリに移動して、glibc-linuxthreadsのソースを展開する(ここがポイント)。
# mkdir /usr/local/gentoo-stage3/tmp/glibc # cd /usr/local/gentoo-stage3/tmp/glibc # tar xjvf 適当なパス/glibc-2.3.6.tar.bz2 # cd glibc-2.3.6 # tar xjvf 適当なパス/glibc-linuxthreads-2.3.6.tar.bz2
★コンパイル
ビルド用のディレクトリを作る。
# cd .. # mkdir build
linux_dist-gentoo-stage3環境にchrootする。
# cd /usr/local/gentoo-stage3 # mount_devfs devfs dev # chroot `pwd` # cd /tmp/glibc/build
configureを下記の通りにする。
# ../glibc-2.3.6/configure \
--prefix=/hoge \
--enable-add-ons=linuxthreads \
--without-__thread
makeをするが、途中で「ELF binary type "0" not known.」と言うエラーメッセージが出て止まったら、FreeBSD環境からbrandlfでLinuxのバイナリだと教えてやる。
# brandelf -t Linux /usr/local/gentoo-stage3/tmp/glibc/build/elf/ld-linux.so.2
makeが終わったら、「make install」をする前に、/usr/local/gentoo-stage3/tmp/glibc/build/elf以下の実行ファイル全部にbrandlfをする。
さらに/hoge/etc/ld.so.confを空ファイルで用意する。
(linux_dist-gentoo-stage3環境で) # mkdir -p /hoge/etc # touch /hoge/etc/ld.so.conf
linux_base-fc4用のFreeType2、Fontconfig、libXft
以前にlinux-firefoxで日本語BOLDを表示出来る様にしたが、それでも文字化けに悩まされるので何とかする。
ちょうどXorgのクロスコンパイル環境を作ってたので、これでFreeType2、Fontconfig、libXftをビルド。
出来上がったライブラリをlinux_base-fc4環境に上書きしたら文字化けもばっちり直った。
せっかくなので、ビルドしたライブラリを置いておく。
多分i386のFreeBSD用。
linux-ft-fc-Xft-20070126.i386.tar.gz
- freetype-2.2.1
- fontconfig-2.3.2 + fontconfig-2.3.2-noftinternals.patch
- libXft-2.1.7 + cjk-patch
の構成になってて、これは自分のFreeBSD環境と同じ。
使い方
念のために/compat/linux/usr/libのバックアップを取っておく。
/compat/linuxに移動して、ファイルをダウンロード。
MD5が下記の通りになってればダウンロードは成功してる。
# cd /compat/linux # fetch http://www.geocities.jp/spr_bsd_linux/freebsd/linux-ft-fc-Xft-20070126.i386.tar.gz # md5 < linux-ft-fc-Xft-20070126.i386.tar.gz 13f14491ee7de5db3cb5adfec47f17ee
その場でファイルを展開すると、ライブラリが上書きされる。
# tar xzvf linux-ft-fc-Xft-20070126.i386.tar.gz
${HOME}/.fonts.confを編集。
これを基本にして、自分の設定を付け加えればいいと思う。
medium medium bold
gccのインラインアセンブラのデモ
何となく作ってみたgccのインラインアセンブラを使った超簡単なサンプルプログラム。
ついでにSSE2命令を使ってみた。
#includevoid test() { int i[4]; int j[4] = { 1, 2, 3, 4 }; int k[4] = { 5, 6, 7, 8 }; asm("movdqa %0, %%xmm0" : "=m" (j)); asm("movdqa %0, %%xmm1" : "=m" (k)); asm("paddd %xmm1, %xmm0"); asm("movdqa %%xmm0, %0" : "=m" (i)); printf("%d, %d, %d, %d\n", i[0], i[1], i[2], i[3]); } int main() { test(); return 0; }
配列j、kの中身を足してiに代入する。
実行すると下記のようになる。
$ gcc test.c $ ./a.out 6, 8, 10, 12
本来なら下記のようにやるのを、128ビットのレジスタを使って一気に代入してる。
i[0] = j[0] + k[0]; i[1] = j[1] + k[1]; i[2] = j[2] + k[2]; i[3] = j[3] + k[3];