PPC-Linuxバイナリ生成の為のクロスbinutils/gcc/glibcのビルド方法

目次

  1. はじめに
  2. 前準備
  3. ビルドの手順
  4. ビルドしたツールを使用する
  5. その他
  6. 履歴

はじめに

Cygwin上でPPC-Linux向けのPPCクロス binutils、gcc、glibcを ビルドした手順メモです。 PPC-Linux向けと言いつつも、ppcsim上で動作させる事を目的としている為、 スタティックライブラリを使用する環境の構築に限定しています。
Cygwin上で実行する為の特殊事情なども含まれていますが、 UNIX系OSであればinstall時にスーパーユーザになる必要があるなどの 点を除き、特別にプラットフォームに依存する点は無いと思われます。

前準備

以下のバージョンを使用しました。これ以外のバージョンだと うまくビルドできない場合があるかも知れません。そのときはダメな部分を 自力で解決していただくという事で。

  1. binutils-2.22
  2. gcc-4.6.2
  3. glibc-2.14.1

前述のツール群はそれぞれ最寄のftpサイトなどからダウンロードします。

他、以下のファイルをダウンロードしてください。

  1. 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する方法は以下です。

  1. cd ~/buildtools
  2. bzip2 -dc ~/archive/binutils-2.22.tar.bz2 | tar xvf -
  3. cd binutils-2.22
  4. mkdir build
  5. cd build
  6. ../configure --target=powerpc-linux --prefix=/usr/local/ppc
  7. make
  8. 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する方法は以下です。

  1. cd /usr/local/ppc
  2. xz -dc ~/archive/glibc_head2141.tar.xz | tar xvf -
  3. cd ~/buildtools
  4. bzip2 -dc ~/archive/gcc-4.6.2.tar.bz2 | tar xvf -
  5. cd gcc-4.6.2
  6. mkdir build
  7. cd build
  8. ../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
  9. make
  10. make install
  11. /bin/rm -fr /usr/local/ppc/powerpc-linux/sys-include
  12. cd /usr/local/ppc/lib/gcc/powerpc-linux/4.6.2/
  13. 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する方法は以下です。

  1. mkdir /usr/local/ppc/powerpc-linux/include
  2. cp -rp /usr/local/ppc/glibc_head2141/include/linux /usr/local/ppc/powerpc-linux/include/.
  3. cp -rp /usr/local/ppc/glibc_head2141/include/asm /usr/local/ppc/powerpc-linux/include/.
  4. cp -rp /usr/local/ppc/glibc_head2141/include/asm-generic /usr/local/ppc/powerpc-linux/include/.
  5. cd ~/buildtools
  6. xz -dc ~/archive/glibc-2.14.1.tar.xz | tar xvf -
  7. cd glibc-2.14.1
  8. mv Makeconfig Makeconfig.org ; sed 's/\.oS/\.oss/g' Makeconfig.org > Makeconfig
  9. mv Makerules Makerules.org ; sed 's/\.oS/\.oss/g' Makerules.org > Makerules
  10. mv extra-lib.mk extra-lib.mk.org ; sed 's/\.oS/\.oss/g' extra-lib.mk.org > extra-lib.mk
  11. mv nptl/Makefile nptl/Makefile.org ; sed 's/\.oS/\.oss/g' nptl/Makefile.org > nptl/Makefile
  12. mv sysdeps/i386/i686/Makefile sysdeps/i386/i686/Makefile.org ; sed 's/\.oS/\.oss/g' sysdeps/i386/i686/Makefile.org > sysdeps/i386/i686/Makefile
  13. 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
  14. mkdir build
  15. cd build
  16. 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
  17. make
  18. 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をビルドしたときに展開したソースをそのまま使用します。

  1. cd ~/buildtools/gcc-4.6.2
  2. mkdir rebuild
  3. cd rebuild
  4. ../configure --target=powerpc-linux --prefix=/usr/local/ppc --enable-languages=c,c++ --disable-threads --disable-shared --disable-libstdcxx-pch --disable-bootstrap
  5. make
  6. 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する例を示します。

  1. 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
  2. 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ベースに書き換えた。


TOP PREV