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

★インストール方法

あらかじめalsa-lib-devel、XOrg-gl-devel、fontforgeをインストールして、

(ターゲットがi686の場合)
$ rpmbuild --rebuild --target=i686 wine-0.9.30-spr1.src.rpm

としてやると、ソースがコンパイルされる。
しばらく経つと${HOME}/rpm/RPMS/i686RPMファイルが出来上がり、rootになって「rpm -ihv」でインストール出来る。

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をクロスコンパイル

FreeBSDglibcをクロスコンパイル出来たのでメモ。
コンパイル出来たけど使い道が思いつかない…


ロスコンパイルには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


「make install」をすると、/hoge以下にglibcがインストールされる。

FreeBSD版のブラウザは遅い?

ここにあるレンダリングベンチマークにwww/firefoxとwww/linux-firefoxとwww/operaを突っ込んでみた。
何故かエミュレートして動かしてるlinux-firefoxが速かった。


CPU: Celeron 2.66GHz

linux_base-fc4用のFreeType2、Fontconfig、libXft

以前にlinux-firefoxで日本語BOLDを表示出来る様にしたが、それでも文字化けに悩まされるので何とかする。


ちょうどXorgのクロスコンパイル環境を作ってたので、これでFreeType2、Fontconfig、libXftをビルド。
出来上がったライブラリをlinux_base-fc4環境に上書きしたら文字化けもばっちり直った。


せっかくなので、ビルドしたライブラリを置いておく。
多分i386FreeBSD用。
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
    
  


あとはlinux-firefox等を起動してみてフォントを見てみる。

gccのインラインアセンブラのデモ

何となく作ってみたgccインラインアセンブラを使った超簡単なサンプルプログラム。
ついでにSSE2命令を使ってみた。

#include 

void 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];