Linux 上で Windows のモジュールをコンパイルする方法は Google 先生に聞くと結構出てくるけど、その逆がなかなか出てこない。
ということで Windows 上で Linux のモジュールをコンパイルする方法をメモ。
他のプラットフォームのモジュールを作成できるコンパイラを使う方法。もうそのまんま。
Cygwin か MinGW/msys ということになると思う。導入に関する詳細は下記ページで。
ここでは Cygwin を使ってみる。
理屈としては、ターゲットとなる Linux の C++ 環境をターゲットとして、Cygwin で gcc をコンパイルすれば良いということになる。
と思ったけど、上手くいかないので、とりあえず以下のサイトからコンパイル済みのクロスコンパイラをいただいて使用することにする。
上記サイトの クロスコンパイラ をいただく。
実は、私もやろうとしたけど、挫折した。
一応、こうすればできるらしいということを、今後の為にメモしておく。
$ mkdir /tmp/linux-runtime
$ cp -r /lib /tmp/linux-runtime $ cp -r /usr/lib /tmp/linux-runtime $ cp -r /usr/include /tmp/linux-runtime
$ tar zxvf binutils-2.19.tar.gz $ tar zxvf gcc-3.3.4.tar.gz
$ mkdir /usr/local/linux
$ mv -R (どこか)/linux-runtime /usr/local/linux $ ls /usr/local/linux lib include
/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )↓
/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ GROUP ( /usr/local/linux/lib/libc.so.6 /usr/local/linux/lib/libc_nonshared.a )
$ cd /home/user/work/binutils-2.19 $ mkdir build $ cd build $ ../configure --prefix=/usr/local/linux \ --target=i686-linux \ --host=i686-pc-cygwin \ --build=i686-pc-cygwin (略) $ make $ make install
$ PATH=/usr/local/linux/bin:$PATH
$ cd /home/user/work/binutils-2.19 $ mkdir build $ cd build $ ../configure --prefix=/usr/local/linux \ --target=i686-linux \ --host=i686-pc-cygwin \ --build=i686-pc-cygwin \ --enable-languages=c,c++ \ --enable-shared \ --enable-threads \ --includedir=/usr/local/linux/include (略) $ make $ make install※ オプション不要なものや足りないものがあるかもしれない。
/usr/local/linux/bin /usr/local/linux/include /usr/local/linux/lib /usr/local/linux/man /usr/local/linux/share
i686-linux-as i686-linux-gcc i686-linux-g++
$ i686-linux-gcc hello.c -o helloこれで hello が出力される。が、Windows 上では実行できない。
となるはずが、私は上手くいかない。何か手順が足りないんだと思うけど。。
Cygwin 環境で、以下の構成になっているとする。
試しに Cygwin のみでコンパイルしてみる。
$ mkdir /home/user/work/hello $ cd /home/user/work/hello
#include <stdio.h> int main(int argc, char* argv[]) { printf("Hello World!\n"); return 0; }
$ i686-linux-gcc hello.c -o hello※ gcc で起動すると Cygwin の gcc が動くので、i686-linux-gcc を指定すること。
$ ls hello hello.c $ ./hello Hello World!
Eclipse は CDT を使うよ。
特にインストーラなどはなくて、適当なディレクトリに展開するだけ。
次に、日本語化する。英語のままでも良いならここは不要。
※ ただ、下の説明は日本語化したのを前提に書いてマス。
これも特にインストーラはなくて、展開したフォルダやファイルたちを Eclipse を展開した場所に上書きするだけ。
早速 Eclipse を使ってみる。
#include <stdio.h> int main(int argc, char* argv[]) { printf("Hello World!\n"); return 0; }
$ ./hello
といっても、telnet や rlogin でコマンド叩くのは、直接 Linux 上で作業するのと変わらないので、ここは Eclipse を使ってリモートでコンパイルする方法を書く。
rsh を使うので、ホストとなる Linux 側で以下の設定をする。rsh は大抵デフォルトで入ってるけど、最近はセキュリティ性を考慮して無効になっていることが多い。
$ rpm -qa rsh-server rsh-server-0.17-58.fc12.i686 ※ ↑私の環境の場合の例。とにかく入っていれば何かヒットする。
$ su # yum install rsh-server
/etc/xinetd.d/rexec /etc/xinetd.d/rsh
service exec { disable = no # ← ここ。他はいじらない。 socket_type = stream wait = no user = root log_on_success += USERID log_on_failure += USERID server = /usr/sbin/in.rexecd }
service shell { disable = no # ← ここ。他はいじらない。 socket_type = stream wait = no user = root log_on_success += USERID log_on_failure += USERID server = /usr/sbin/in.rshd }
$ su # /etc/rc.d/init.d/xinetd restart xinetd を停止中: [ OK ] xinetd を起動中: [ OK ]
$ cd ~ $ pwd /home/(ユーザ名)
$ vi .rhosts 192.168.1.255 hogehoge # ← スペースで区切る。
$ ls -l -a | grep .rhosts -rw-rw-r--. 1 hogehoge group1 28 2010-05-20 16:02 .rhosts多分、グループに書き込み許可がついてる。不思議なことに、所有者以外に書き込み許可があると、rsh でパーミッションエラーが出る。ので、自分だけ書き込み許可をする。
$ chmod 644 .rhosts $ ls -l -a | grep .rhosts -rw-r--r--. 1 hogehoge group1 28 2010-05-20 16:02 .rhosts-rw-r--r-- になっていれば OK。
ここまでで、rsh の設定は終わり。
Windows 側に戻って Cygwin の rsh で繋いでみる。
ちなみに、最近の Cygwin は rsh がデフォルトで入ってこないので、入れてない場合はまずインストールしておく。Setup.exe からいつもの感じで入れればいい。「Net」カテゴリの下あたりにあるはず。
ということで、つないでみる。
接続先 Linux マシンが 192.168.1.1、ユーザ名 hogehoge とすると、
$ rsh -l hogehoge 192.168.1.1 -n "hostname"
これで Linux マシンのホスト名が返ってくれば設定は OK。
samba も使うので、その設定。下記を参考にどうぞ。
samba を設定したら下記設定をしておく。
$ cd ~ $ mkdir rmake $ cd rmake $ vi rmake.sh #!bin/bash cd /var/samba/workspace/hello/src make $1※ フォルダやシェルの名前は何でも良い。
Eclipse でリモートコンパイルの設定をする。
all : rsh 192.168.1.1 -l hogehoge -n "~/rmake/rmake.sh" .PHONY : clean clean : rsh 192.168.1.1 -l hogehoge -n "~/rmake/rmake.sh"
#include <stdio.h> int main(int argc, char* argv[]) { printf("Hello World!\n"); return 0; }
hello: hello.c gcc -o hello hello.c
$ /var/samba/share/workspace/hello/src/hello Hello World!
でも、これは速度的にあんまり実用的じゃないかなぁ。