![]() |
||||||||||||||||||||||||||
Sorry, this site is Japanese only.
当サイトはFireFoxの普及を 応援しています。 |
Linux Workstation
Vine Linux 3.1 AMD64化
私の愛用する Vine Linux には今のところ AMD64 版が用意される気配はないようです.
しかし,せっかく Athlon64 マシンを持っているのだから,
64bitの世界を味わってみたいのが人の常. 謝辞この作業に当たり「2ちゃんねる」の Linux 板の住民の皆さんのアドバイスをもらいました. 特に「AMD 64ビットCPUでLINUXしよう Part2」 の732さんが提供してくれたSlackwareの64bit化手順 ftp://ftp.cs.tohoku-gakuin.ac.jp/pub/Linux/packages/Slackware/TarBall.Linux64/How2Make.amd64 を元に作業を進めさせていただきました.
そのおかげといっては何ですが,
ここでやってること,実は半分ほどしか理解してなかったりします.
本当に必要な作業かどうかはっきりしないでやってたりします.
それと,一応私の環境では問題なく動くことを確認しましたが,
ほかの環境でどうなるのか全くわかりません.
これみてやってみようって人は自己責任でお願いします. 前提
Vine Linux 3.1 のインストールCDからフルインストールを選んでインストールした状態から始めました.
本当は Vine Linux をベースに進めるのでrpmベースでやんなきゃいけないんだろうけど,
tar 玉から configure -> make -> make install でやってます.rpm の作り方勉強不足でわからんもんで.
使用した各ファイル
(本家サイトを示してますがringサーバとか
kddilabsを使って負荷分散しましょう) 0. 開発環境のインストールVine Linux 3.1 のフルインストールしただけでは開発用パッケージがインストールされていないので,まず,それを用意 (はじめ気づかないで悩んでた,エラーに command not found とかでてるのに(笑)) apt-get update apt-get build-dep binutils gcc glibc kernel
とする,フルインストール直後の状態なら(12/3 現在で)
bison dejagnu expect flex gd-devel gettext libpng-devel thread zlib-devel
がインストールされる.詳細は知らない. apt-get install ncurses-devel あと, module-init-tools をビルドするときに docbook2man を要求されるので(あんまり本質じゃないけど), docbook-utils をインストール apt-get install docbook-utils これで, docbook-style-dsssl docbook-utils jadetex tetex-extra がインストールされる. 1. クロスコンパイル環境の構築1.1 クロスコンパイル用binutilsの準備
ftp://ftp.gnu.org/gnu/binutils/ x86-64向けのバイナリを吐くようにビルドする. インストール先は ~/work/cross tar xvjf binutils-2.15.94.0.1.tar.bz2 mkdir binutils-cross cd binutils-cross ../binutils-2.15.94.0.1/configure\ --host=i686-pc-linux-gnu\ --target=x86_64-unknown-linux-gnu\ --prefix=$HOME/work/cross make make install ここで, --prefix ってのはインストール先ディレクトリを指す. 失敗してもできる限りシステムに影響が出ないように一般ユーザの作業領域で作業する. 1.2 クロスコンパイル用 gcc の準備
ftp://ftp.gnu.org/gnu/gcc/
から適当なのをとってくる export PATH=$HOME/work/cross/bin:$PATH ( cd $HOME/work/cross/x86_64-unknown-linux-gnu; ln -s /usr/include ) tar xvjf gcc-3.4.3.tar.bz2 mkdir gcc-cross cd gcc-cross ../gcc-3.4.3/configure\ --enable-__cxa_atexit\ --enable-languages=c\ --disable-shared\ --host=i686-pc-linux-gnu\ --target=x86_64-unknown-linux-gnu\ --prefix=$HOME/work/cross make make install これで,クロスビルド環境が一通りできあがり. 2. カーネル(仮)構築ftp://ftp.kernel.org/pub/linux/kernel/ から適当なパッケージをとってくる tar xvjf linux-2.6.9.tar.bz2 cd linux-2.6.9 Makefile を編集, Makefile の頭に EXTRAVERSION =
ってところがあるので,自分の好きなサブバージョン名をつける,私は -amd64-0 とした. EXTRAVERSION = -amd64-0 クロスコンパイルの設定をする. Makefile に ARCH ?= $(SUBARCH) CROSS_COMPILE ?= ってところがあるので ARCH ?= x86_64 CROSS_COMPILE ?= $(HOME)/work/cross/bin/x86_64-unknown-linux-gnu- と書き換える. $(HOME) は直書きしてください /home/hogehoge とか.
あとは, make menuconfig とかして適当にコンフィグ,ただし Loadable Module support はオフにしておく,
(モジュールのロードに x84-64 ネイティブのユーティリティが必要らしい) make make install
lilo.conf がないとエラー出すけど放置 ではリブート 3. x86-64 環境の整備ここまでうまくいっていればあっさりと 64bit カーネルで起動します. ただし,カーネル以外全部がまだ 32bit バイナリなので注意.
/usr/src/linux のリンクを新しいカーネルソースへ書き換え, cd /usr/src rm linux ln -s $HOME/work/linux-2.6.9 linux cd linux/include cd /usr/include/ ln -s ../src/linux/include/asm-generic 4. x86-64 ネイティブの開発環境整備(第一段階)4.1 glibcのスタティックビルド
ftp://ftp.gnu.org/gnu/glibc/
から適当なバージョンのをとってくる. tar xvjf glibc-2.3.3.tar.bz2 cd glibc-static export PATH=$HOME/work/cross/bin:$PATH export CC=$HOME/work/cross/bin/x86_64-unknown-linux-gnu-gcc export ac_cv_type_long_double=no ../glibc-2.3.3/configure\ --disable-shared\ --disable-profile\ --enable-add-ons=linuxthreads\ --prefix=/usr make gnulib=-lgcc make install ac_cv_type_long_double=no ってしてるのは checking size of long double... configure: error: cannot compute sizeof (long double), 77
とかっていうエラーの対策 /x86_64-unknown-linux-gnu/bin/ld: cannot find -lgcc_eh
とかっていうエラーの対策 unset ac_cv_type_long_double 4.2 binutils のスタティックビルド
ネイティブの binutils をビルドします.
2.15.94.0.1 ではビルドに失敗し解決できなかったので, 2.15を使っています.(だれかおせーて) ( cd $HOME/work/cross/x86_64-unknown-linux-gnu; ln -s /usr/lib64 lib64 ) mkdir binutils-static cd binutils-static export PATH=$HOME/work/cross/bin:$PATH export CC=$HOME/work/cross/bin/x86_64-unknown-linux-gnu-gcc ../binutils-2.15/configure --disable-shared --prefix=/usr make make install 4.3 gcc のスタティックビルドbinutils と同様に gcc もビルド mkdir gcc-static cd gcc-static export PATH=$HOME/work/cross/bin:$PATH export CC=$HOME/work/cross/bin/x86_64-unknown-linux-gnu-gcc ../gcc-3.4.3/configure\ --enable-__cxa_atexit\ --enable-languages=c\ --disable-shared\ --prefix=/usr make make install 5. x86-64 ネイティブの開発環境整備(第二段階)5.1 glibc のネイティブビルド
ネイティブのビルド環境が整ったところで,
glibc のビルドを行います. mkdir glibc-partial cd glibc-partial export CFLAGS="-O2 -fno-unit-at-a-time" ../glibc-2.3.3/configure\ --enable-add-ons=linuxthreads\ --prefix=/usr make gnulib=-lgcc make install 終わったらCFLAGSを消す unset CFLAGS 5.2 binutils のネイティブビルド
binutils も同様にビルド mkdir binutils-native cd binutils-native ../binutils-2.15.94.0.1/configure\ --enable-shared\ --prefix=/usr make export LD_LIBRARY_PATH=/usr/lib make install 5.3 gcc のネイティブビルドgcc も同様にビルド mkdir gcc-native cd gcc-native ../gcc-3.4.3/configure\ --enable-__cxa_atexit\ --enable-languages=c\ --prefix=/usr make make install 6. x86-64 ネイティブの開発環境整備(第三段階)6.1 glibcのネイティブビルドシェアドライブラリを使ったビルド環境ができあがったら, 再度 glibc をビルド,前回と同様に最適化抑制フラグを設定 mkdir glibc-native cd glibc-native export CFLAGS="-O2 -fno-unit-at-a-time" ../glibc-2.3.3/configure\ --enable-add-ons=linuxthreads\ --prefix=/usr make make install unset CFLAGS 6.2 gcc のネイティブビルド最後に, gcc, g++ をビルド mkdir gcc-native2 cd gcc-native2 ../gcc-3.4.3/configure\ --enable-__cxa_atexit\ --enable-languages=c,c++\ --prefix=/usr make make install 7. ローダブルモジュール付きカーネルが利用できるようにする7.1 module-init-toolsのビルド
ftp://ftp.kernel.org/pub/linux/utils/kernel/module-init-tools/
から適当なのをとってくる. tar xvjf module-init-tools-3.1.tar.bz2 mkdir module cd module ../module-init-tools-3.1/configure --prefix=/ make make install 7.2 ncursesのビルドftp://ftp.gnu.org/pub/gnu/ncurses/ から適当なのをとってくる.本質的ではないが,カーネルのコンフィギュレーションで make menuconfig するときに要求される. これは32bit環境でインストールしたやつではだめみたいなので,この環境用のをビルドします. tar xvzf ncurses-5.4.tar.gz mkdir ncurses cd ncurses ../ncurses-5.4/configure --prefix=/usr make make install 8. カーネル(真)の構築ここまできたらやっとこさローダブルモジュール付きのカーネルが構築できます. クロスビルドしたときの Makefile の設定を元に戻して, make menuconfig make make install make modules_install
これで Vine Linux 3.1 for AMD64 の基礎が完成!? 終わってからやったこと
#include <stdio.h>
main(){
printf("size of short = %d bits\n", sizeof(short) * 8);
printf("size of int = %d bits\n", sizeof(int) * 8);
printf("size of long = %d bits\n", sizeof(long) * 8);
printf("size of long long = %d bits\n", sizeof(long long) * 8);
printf("size of void * = %d bits\n", sizeof(void *) * 8);
}
ってなファイルを作ってコンパイル&実行 size of short = 16 bits size of int = 32 bits size of long = 32 bits size of long long = 64 bits size of void * = 32 bits ってなるわけだが, 64bit 環境では size of short = 16 bits size of int = 32 bits size of long = 64 bits size of long long = 64 bits size of void * = 64 bits
うぉぉぉぉぉぉ!! void * が 64bit 〜〜〜 詰まらんことしかやってませんな.
あと,この作業を通して改めて思ったこと. | |||||||||||||||||||||||||
| 碧色工房-blue studio- Copyright ©2001-2007 大前良介(OHMAE Ryosuke) All rights reserved. | ||||||||||||||||||||||||||