Linux 上で Windows のモジュールをコンパイルする方法は Google 先生に聞くと結構出てくるけど、その逆がなかなか出てこない。
 
 ということで Windows 上で Linux のモジュールをコンパイルする方法をメモ。
 
 #contents
 
 * Windows 上に UNIX 環境を構築 [#b84e6734]
 Cygwin か MinGW/msys ということになると思う。導入に関する詳細は下記ページで。
 
 - [[UNIX on Windows]]
 
 ここでは Cygwin を使ってみる。
 
 * ソースの入手 [#kb724182]
 ターゲットとなる Linux の C++ 環境と、Cygwin でつくる gcc のソースが必要になる。
 * クロスコンパイラの作成 [#kb724182]
 理屈としては、ターゲットとなる Linux の C++ 環境をターゲットとして、Cygwin で gcc をコンパイルすれば良いということになる。
 
 今回、Linux は fedora 11 を使うことにする。ここは、お好みのディストリビューションで OK かと思う。
 と思ったけど、上手くいかないので、とりあえず以下のサイトからコンパイル済みのクロスコンパイラをいただいて使用することにする。
 
 fedora の場合は、下記サイトから C ライブラリをもらってくる。
 - [[NEC の SDDSE 紹介サイト:http://www.nec.co.jp/cced/SDDSE]]
 -- [[サンプルダウンロード:http://www.nec.co.jp/cced/SDDSE/sampledl.html]]
 
 - [[IIJ の公開 FTP:ftp://ftp.iij.ad.jp/]]
 -- [[glibc-2.10.1-2.i586.rpm:ftp://ftp.iij.ad.jp/pub/linux/fedora/releases/11/Fedora/i386/os/Packages/]]
 -- [[glibc-headers-2.10.1-2.i586.rpm:ftp://ftp.iij.ad.jp/pub/linux/fedora/releases/11/Fedora/i386/os/Packages/]]
 gcc は GNU のサイトから引っ張ってくる。
 上記サイトの クロスコンパイラ をいただく。
 
 - [[GNU(ftp):ftp://ftp.gnu.org/gnu]]
 -- [[binutils:ftp://ftp.gnu.org/gnu/binutils]]
 -- [[gcc:ftp://ftp.gnu.org/gnu/gcc]]
 *** クロスコンパイラを自前でつくる場合 [#jb8fc3e2]
 
 FTP で上手くいかないときは [[HTTP の方:http://ftp.gnu.org/gnu]] で。
 実は、私もやろうとしたけど、挫折した。
 
 今回は下記を使う。
 一応、こうすればできるらしいということを、今後の為にメモしておく。
 
 - [[binutils-2.19:ftp://ftp.gnu.org/gnu/binutils/]]
 - [[gcc-3.3.4:ftp://ftp.gnu.org/gnu/gcc/gcc-3.3.4/]]
 + まず、ターゲットとなる Linux 上で、作業用のディレクトリをつくる。
 -- ここでは /tmp/linux-runtime とする。&br;
  $ mkdir /tmp/linux-runtime
 + C/C++ コンパイルに必要なライブラリ(依存関係も全て)をコピーする。
 -- これが、どれが必要なのかよくわからないので、以下のディレクトリを全部コピー。&br;
  $ cp -r /lib /tmp/linux-runtime/lib
  $ cp -r /usr/lib /tmp/linux-runtime/lib
  $ cp -r /usr/include /tmp/linux-runtime/include
 -- 環境によっては 500MB 超える。1GB くらいになることも。
 -- あからさまに C/C++ に関係ないディレクトリは削除しても良いと思う。&br;
 python とか mozilla とか。
 + linux-runtime を samba か scp か何かで Windows へ送る。
 -- サイズが結構あるので、tar.gz とか lzma あたりで固めて移動すると良いかも。
 + ここから Windows 側の作業。Cygwin はインストール済みという前提で。
 -- Cygwin は C:\Cygwin にインストールされているとする。
 + GNU の binutils と gcc のソースをゲットする。
 -- [[GNU(ftp):ftp://ftp.gnu.org/gnu]] のサイトから以下を取得。
 --- [[binutils:ftp://ftp.gnu.org/gnu/binutils]]
 --- [[gcc:ftp://ftp.gnu.org/gnu/gcc]]
 -- 今回は下記を使うものとする。
 --- [[binutils-2.19:ftp://ftp.gnu.org/gnu/binutils/]]
 --- [[gcc-3.3.4:ftp://ftp.gnu.org/gnu/gcc/gcc-3.3.4/]]
 + 上記を Cygwin で適当なところに展開。
 -- ここは /home/user/work に展開したとする。&br;
  $ tar zxvf binutils-2.19.tar.gz
  $ tar zxvf gcc-3.3.4.tar.gz
 + インストール先ディレクトリを作成。
 -- ここは /usr/local/linux とする。&br;
  $ mkdir /usr/local/linux
 + Linux でつくった linux-runtime 配下のファイルを /usr/local/linux に配置。
  $ mv -R (どこか)/linux-runtime /usr/local/linux
  $ ls /usr/local/linux
  lib include
 + /usr/local/linux/lib にある libc.so のパスを修正。
  /* 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 )
     ↓&br;
  /* 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 )
 + binutils をコンパイル、インストール。
  $ 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
 + ここまでで  /usr/local/linux/bin が作成されているはずなので、パスを通しておく。
  $ PATH=/usr/local/linux/bin:$PATH
 + gcc をコンパイル、インストール。
  $ 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
 ※ オプション不要なものや足りないものがあるかもしれない。&br;
 ※ make で [configure-target-libiberty] 的なエラーが出るかも。とりあえず無視する。
 + ここまでで、以下のフォルダが作成されているはず。
  /usr/local/linux/bin
  /usr/local/linux/include
  /usr/local/linux/lib
  /usr/local/linux/man
  /usr/local/linux/share
 + bin の中に以下が出来上がっていればとりあえずコンパイラ完成。
  i686-linux-as
  i686-linux-gcc
  i686-linux-g++
 + 試しに簡単なソースをコンパイルしてみる。
  $ i686-linux-gcc hello.c -o hello
 これで hello が出力される。が、Windows 上では実行できない。&br;
 Linux に hello を持っていって実行できれば、成功!
 
 * Cygwin 環境の準備 [#e92e2709]
 となるはずが、私は上手くいかない。何か手順が足りないんだと思うけど。。
 
 今回は以下のようにする。
 * Eclipse の設定 [#o514c93e]
 
 - ダウンロード/ビルド ディレクトリ → /home/user/work
 - インストール先 ディレクトリ → /usr/linux
 Cygwin 環境で、以下の構成になっているとする。
 
 ということで、/usr/linux に glibc-2.11-2.i686.rpm を入れる。
 - C:/Cygwin
 -- /bin/make
 -- /usr/local/linux/bin/i686-linux-as
 -- /usr/local/linux/bin/i686-linux-gcc
 -- /usr/local/linux/bin/i686-linux-g++
 
  ls /usr/linux
  glibc-2.10.1-2.i586.rpm
 + Eclipse 起動。
 + 「ファイル」→「新規」→「C++ プロジェクト」で、プロジェクト名「hello」、実行ファイル形式を選んで「完了」。
 -- 「Hello World C++ Project」があればそっちで。&br;
 最初からお決まりのサンプルがつく。
 + Hello World がなかった場合はソースを作成。
 -- 左ペインのプロジェクトを右クリックして「新規」→「フォルダ」で「src」フォルダ作成。
 -- 「src」フォルダを右クリックして「新規」→「ソースファイル」で「hello.cpp」を作成。
 -- 「hello.cpp」をダブルクリックして、以下を記述。&br;
  #include <iostream>
  using namespace std;
  
  int main() {
      cout << "Hello World!" << endl;
      return 0;
  }
 + 左ペインのプロジェクトを右クリックして「プロパティ」を開く。
 + 「C++ ビルド」下にある「ツール・チェーン・エディタ」を選択。
 -- 構成はどちらでも良いけど、ここは「Release」をアクティブにする。
 -- 現在のツールチェーン : Cygwin GCC
 -- 現在のビルダー : GNU Make ビルダー
 + 「C++ ビルド」下にある「環境」を選択。
 -- 「設定する環境変数」に以下を追加。
 --- 名前 : PATH
 --- 値 : C:\Cygwin\bin;C:\Cygwin\usr\local\linux\bin
 + 「C++ ビルド」下にある「設定」を選択。
 -- 「ツール設定」に以下を設定。
 --- GCC Assembler コマンド : i686-linux-as
 --- Cygwin C++ Compiler コマンド : i686-linux-g++
 --- Cygwin C Compiler コマンド : i686-linux-gcc
 --- Cygwin C++ Linker コマンド : i686-linux-g++
 -- 「成果物」に以下を設定。
 --- 成果物タイプ : 実行可能
 --- 成果物の名前 : hello
 --- あとは空白。
 -- 「バイナリパーサー」に以下を設定。
 --- 「Cygwin PE パーサー」と「Elf パーサー」にチェック。
 --- あとは チェックをはずす。
 + 「OK」でプロパティを閉じる。
 + 「プロジェクト」→「すべてビルド(Ctrl + B)」でビルドしてみる。
 + 画面下コンソールに特にエラーがなければ、Release フォルダに hello というファイルができる。
 + その hello を Linux に持っていって実行してみる。
  $ ./hello
 + 「Hello World!」と表示されれば、Windows 上で Linux のモジュールができたことになる!
 
 /home/user/work に GCC のパッケージを入れる。
  $ ls /home/user/work
  binutils-2.19.tar.gz gcc-3.3.4.tar.gz
 ※ これはふつうにエクスプローラで移動してくれば OK。
 
 まずは、glibc を展開。
 
  $ cd /usr/linux
  $ rpm2cpio glibc-2.11-2.i686.rpm | cpio -id
  $ rpm2cpio glibc-headers-2.11-2.i686.rpm | cpio -id
 
 これで以下のフォルダが展開される。(5個)
 
  etc
  sbin
  usr
  lib
  var
 
 
 
 -----
 [[Linux メモ]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS