目次
- はじめに
- 前準備
- ビルドの手順
- ビルドしたツールを使用する
- その他
- 履歴
Cygwin上でPPC-Linux向けのPPCクロス binutils、gcc、glibcを
ビルドした手順メモです。
PPC-Linux向けと言いつつも、ppcsim上で動作させる事を目的としている為、
スタティックライブラリを使用する環境の構築に限定しています。
Cygwin上で実行する為の特殊事情なども含まれていますが、
UNIX系OSであればinstall時にスーパーユーザになる必要があるなどの
点を除き、特別にプラットフォームに依存する点は無いと思われます。
以下のバージョンを使用しました。これ以外のバージョンだと
うまくビルドできない場合があるかも知れません。そのときはダメな部分を
自力で解決していただくという事で。
- binutils-2.22
- gcc-4.6.2
- glibc-2.14.1
前述のツール群はそれぞれ最寄のftpサイトなどからダウンロードします。
他、以下のファイルをダウンロードしてください。
-
glibc_head2141.tar.xz(3998208byte)
まず最初にツールのインストール先に予め実行パスを通しておきます。
以降の例では、/usr/local/ppcの下にツール類をインストールする
前提で話を進めます。.bashrcなどに以下のパスを追加します。
export PATH="$PATH:/usr/local/ppc/bin"
以後の説明では、アーカイブ群は ~/archiveの下に置かれて
いる事として、ツールをビルドする一時ディレクトリは ~/buildtools
で行うものとして話を進めます。
binutilsのビルド手順
-
まず最初にbinutilsをビルドします。binutilsとは、GNUソフトウェアの中の、
アセンブラ(gas)、リンカ(gld)、その他、
実行ファイルの生成や解析をサポートするソフトウェア群です。
makeする方法は以下です。
- cd ~/buildtools
- bzip2 -dc ~/archive/binutils-2.22.tar.bz2 | tar xvf -
- cd binutils-2.22
- mkdir build
- cd build
- ../configure --target=powerpc-linux --prefix=/usr/local/ppc
- make
- make install
※注目点
- ■--prefixオプションを使用する
- make install を実行した際、--prefixオプションで指定した
ディレクトリの下にbuildしたツール類がインストールされます。
こうする事により、既存のネイティブ環境ツールと混ざる事が
無くなる為、どこに何が入るか把握しやすくなると思われます。
指定しないと/usr/local/の下にインストールされます。
- ■build自体は別ディレクトリで行う
- buildディレクトリを作成して、その中でconfigureを実行しています。
後で述べるgccのmakeは二度実行する必要があるのですが、その際
make clean を実行する必要が無いというメリットがあります。
- ■ターゲット名
- ビルドされるクロスアセンブラ/リンカ等のツールは/usr/local/ppc/bin
の下にインストールされますが、powerpc-linux-as.exe などの様にターゲット
名が付加された形でインストールされます。このターゲット名は、のち
のgcc,glibcのビルドにおいて、configureがクロスツールを使用する
際のキーになっています。
gccのビルド手順
-
続いてgccをビルドします。gccは、GNUソフトウェアの中の、Cコンパイラ、C++コンパイラ、
その他言語のコンパイラを含むコンパイラソフトウェア群です。
makeする方法は以下です。
- cd /usr/local/ppc
- xz -dc ~/archive/glibc_head2141.tar.xz | tar xvf -
- cd ~/buildtools
- bzip2 -dc ~/archive/gcc-4.6.2.tar.bz2 | tar xvf -
- cd gcc-4.6.2
- mkdir build
- cd build
- ../configure --target=powerpc-linux --prefix=/usr/local/ppc --enable-languages=c --with-headers=/usr/local/ppc/glibc_head2141/include/ --disable-shared --disable-threads --disable-multilib --disable-decimal-float --disable-libmudflap --disable-libssp --disable-libgomp --disable-libquadmath --disable-target-libiberty --disable-target-zlib
- make
- make install
- /bin/rm -fr /usr/local/ppc/powerpc-linux/sys-include
- cd /usr/local/ppc/lib/gcc/powerpc-linux/4.6.2/
- ln -s libgcc.a libgcc_eh.a
※注目点
- ■GMP/MPFR/MPCを予めインストールしておく
- gcc-4.6.xでは GCCのビルド自体を行う為に GMPや MPFRや MPCといったライブラリが必要です。
パッケージインストールするのが簡単で良いでしょう。
- ■--with-headersを指定する
- gcc-3.2の時にnewlibヘッダを使用する方法でビルドできなかった為、予め用意した
glibcヘッダを使用する方法としたのですが、今回もそれをそのまま引き継いでいます。
なお、/usr/local/ppc/glibc_head2141/include/の最後の'/'は忘れない様にしてください。
- ■--enable-languagesを指定する
- gccのアーカイブにはCompiler Collectionという名にふさわしく様々なプログラム
言語のコンパイラが含まれています。glibcをビルドするための今回のgccのビルド
ではCコンパイラだけが必要なので、--enable-languagesを指定してCコンパイラ
だけビルドしています。
- ■各種機能サポートを無効にする
- gcc-4.6.xではコンパイルエラーを回避する為に、 --disable-shared --disable-threads --disable-multilib --disable-decimal-float --disable-libmudflap --disable-libssp --disable-libgomp --disable-libquadmath --disable-target-libiberty --disable-target-zlib を指定しています。
- ■libgcc_eh.a をlibgcc.a へのシンボリックリンクにしておく
- --disable-sharedを指定するとlibgcc_eh.aが生成されないのですが、次のglibcのビルドで
リンクしようとしてエラーします。これを解決する為に、libgcc.aへのシンボリックリンクを
生成しておきます。
glibcのビルド手順
-
glibcをビルドします。
makeする方法は以下です。
- mkdir /usr/local/ppc/powerpc-linux/include
- cp -rp /usr/local/ppc/glibc_head2141/include/linux /usr/local/ppc/powerpc-linux/include/.
- cp -rp /usr/local/ppc/glibc_head2141/include/asm /usr/local/ppc/powerpc-linux/include/.
- cp -rp /usr/local/ppc/glibc_head2141/include/asm-generic /usr/local/ppc/powerpc-linux/include/.
- cd ~/buildtools
- xz -dc ~/archive/glibc-2.14.1.tar.xz | tar xvf -
- cd glibc-2.14.1
- mv Makeconfig Makeconfig.org ; sed 's/\.oS/\.oss/g' Makeconfig.org > Makeconfig
- mv Makerules Makerules.org ; sed 's/\.oS/\.oss/g' Makerules.org > Makerules
- mv extra-lib.mk extra-lib.mk.org ; sed 's/\.oS/\.oss/g' extra-lib.mk.org > extra-lib.mk
- mv nptl/Makefile nptl/Makefile.org ; sed 's/\.oS/\.oss/g' nptl/Makefile.org > nptl/Makefile
- mv sysdeps/i386/i686/Makefile sysdeps/i386/i686/Makefile.org ; sed 's/\.oS/\.oss/g' sysdeps/i386/i686/Makefile.org > sysdeps/i386/i686/Makefile
- mv sysdeps/sparc/sparc32/sparcv9/Makefile sysdeps/sparc/sparc32/sparcv9/Makefile.org ; sed 's/\.oS/\.oss/g' sysdeps/sparc/sparc32/sparcv9/Makefile.org > sysdeps/sparc/sparc32/sparcv9/Makefile
- mkdir build
- cd build
- AR=powerpc-linux-ar CC=powerpc-linux-gcc RANLIB=powerpc-linux-ranlib ../configure --host=powerpc-linux --prefix=/usr/local/ppc/powerpc-linux --with-headers=/usr/local/ppc/powerpc-linux/include/ --disable-profile --enable-add-ons libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
- make
- make install
※注目点
- ■予めlinuxカーネルヘッダをコピーしておく
- ターゲットシステムをLinuxとしてビルドしている為、glibcのビルドには
Linuxカーネルに含まれるヘッダファイルが必要です。
- ■Cygwinでビルドする為の変更を加える
- ビルドする中で、.oSと.osという拡張子のファイルが生成されるのですが、Cygwinでは
ファイル名の大文字と小文字が区別されない為、同じディレクトリ内にfoo.oSとfoo.os
両方のファイルが生成できずビルドに失敗してしまいます。手順の8〜13で.oSを.oss
を使用するように変更を加えています。
因みに、Linuxではファイルの大文字と小文字は区別される為、8〜13の手順は無くても
ビルドに失敗する事はありません。
- ■--disable-sharedではビルドできないっぽい
- ppcsimで実行する事を目的としている都合、スタティックライブラリのみビルドできれば良い
のですが、--disable-sharedを付けるとビルドに失敗してしまいます。この為、
--disable-sharedは外してglibcはビルドする事とし、コンパイル時(リンク時)に-staticオプションを
付けてスタティックリンクする事にします。
gccの再ビルド手順
-
最後にgccを再度ビルドします。このビルドを行う事によって、インストール
したglibcをホストライブラリとして使用するクロスgccが生成されます。
最初のgccをビルドしたときに展開したソースをそのまま使用します。
- cd ~/buildtools/gcc-4.6.2
- mkdir rebuild
- cd rebuild
- ../configure --target=powerpc-linux --prefix=/usr/local/ppc --enable-languages=c,c++ --disable-threads --disable-shared --disable-libstdcxx-pch --disable-bootstrap
- make
- make install
※注目点
- ■--enable-languagesでC++コンパイラを追加する
- 特にC++コンパイラを使用する事が無ければ、最初のgccビルドと同じ様にcだけを指定
すれば良いでしょう。
Cygwin-1.3.12をWindows98で使用していた時はCygwinのバグでconfigureに失敗する事が
あったのですが、Cygwin-1.7.9-1をWindowsXPで使用する分には問題無くなっているようです。
/usr/local/ppc/bin/powerpc-linux-* 内のツールがクロスツールになります。
ツールをビルドする前に実行パスを通している為、powerpc-linux-*を実行する
と使用できるようになっているハズです。
IJGのjpegツール(jpegsrc.v8c.tar.gz)をconfigure,makeする例を示します。
- AR=powerpc-linux-ar CC=powerpc-linux-gcc RANLIB=powerpc-linux-ranlib ./configure --target=powerpc-linux --host=i686-pc-linux-gnu --build=powerpc-linux --disable-shared
- make LDFLAGS=-all-static V=1
以上で、クロスgccを使用してPPCネイティブなjpegツール群をmakeする事が
できます。configureを使用しているものであれば、おおよそ同様の方法でmakeが可能と思われます。
今回使用したIJGのv8cではlibtoolが使用されている為、スタティックリンクを行う
のにmake実行時に「LDFLAGS=-all-static」を指定しています。v6bではlibtoolを使用して
いないので、「LDFLAGS=-static」で良いと思います。
今回、新しいbinutils/gcc/glibcでtoolチェインをビルドするにあたって、
「Linux From Scratch」を
参考にさせていただきました。
2002.10.27 : 初版
2002.10.29 : 言いまわしなどの修正を行った。
2006.03.21 : binutils-2.16.1,gcc-3.4.5,glibc-2.3.6ベースに書き換えた。
2011.12.04 : binutils-2.22,gcc-4.6.2,glibc-2.14.1ベースに書き換えた。