make gcc on Solaris 2 without gcc-binaries


There seems to be some frequent access from outside of Japan. If you are interested in making gcc cross compiler from SunOS 4.x to Solaris 2.x, please mail me to request to translate this page into English.

Or, if you are in trouble with values-Xa.o just installing gcc binaries, values-Xa.o should reside at /usr/ccs/lib/values-Xa.o, which is in the package SUNWarc. Correcting "link-path" will solve your trouble.

[English page] has few information now.

英語版 Free Solaris 7 で、クロスコンパイルによる gcc-2.8.1 の make ができています。
こちらも合わせて御覧下さい。

From: yamamori (YAMAMORI Takenori)
Newsgroups: fj.sys.sun
Subject: make gcc on Solaris2 without gcc-binaries-2.5.6
Date: 21 Dec 1996 10:25:48 GMT
Lines: 207
Message-ID: <59gdvc$phu@news.kt.rim.or.jp>


  このグループは初登場です。山森と申します。

  SunSPARCstation2 を所有していまして、SunOS4.1.4 と Solaris2.5.1 の両方が
ブート可能な状態で使用しています。このたび、Solaris2 上に gcc-binaries の
力を借りずに gcc を make することが出来ましたので、そのことについて
報告します。

長文ですが何らかのお役に立てば幸いです。

(OS 名として、慣習的に SunOS4, Solaris2 と言ういい方を使います)

-------
  Solaris2 では cc がバンドルされておらず、一般的には gcc-binaries-2.5.6 を
取り寄せ、これを使って gcc の最新版をコンパイルすることが多いと思います。

  しかし、せっかく SunOS4 上には gcc があるので、これを使って gcc-binaries
の力を借りず、自力で Solaris2 上に gcc を立ち上げることは出来ないかと
考えました。

-------
最初に考えた方法

  互換ライブラリにより、Solaris2 上でも SunOS4 用のバイナリは一応
実行できます。それなら、SunOS4 用の gcc が Solaris2 上で何とか動かないか、
という発想です。つまり、

    gcc (ドライバー)         -----  SunOS4 用を互換ライブラリで使う
    /.../gcc-lib/.../.../cpp   -----  SunOS4 用を互換ライブラリで使う
    /.../gcc-lib/.../.../cc1   -----  SunOS4 用を互換ライブラリで使う
    as                         -----  /usr/ccs/bin/as を使う
    ld                         -----  /usr/ccs/bin/ld を使う

ということです。しかし問題があります。
    * cpp に渡されるあらかじめ define された定数が、SunOS4 と Solaris2 では
      違い、SunOS4 の gcc を流用すると SunOS4 の define になってしまう。
    * CPU は同じであるが、アセンブラの書式(疑似命令?)が、SunOS4 と
      Solaris2 で、若干違うようである。

ということで、この方法も可能性はあると思いますが、別の方法として
素直にクロスコンパイラを作ることにしました。

  クロスコンパイラを作るつもりなら、何も SunOS4 からでなくても、
gcc がサポートしている他のプラットフォームからでも、そこに Solaris2 の
コードを出力するクロスコンパイラを作れば良いと考えられます。

  しかし、SunOS4-->Solaris2 のクロスコンパイラ自体、何かと役立つかも
知れないし、また、クロスコンパイラの make 自体にも興味があるので、
この方法で進めることにしました。

-----------------------------------------------------------------------------
SunOS4 上にクロスコンパイラを作り、それを使って Solaris2 gcc を作成する方法。

                                                       山森丈範
                                          Dec. 21 1996 yamamori


  * まず、クロスアセンブラ等を作成。
      SunOS4 上で、binutils-2.7 を、configure --target=sparc-sun-solaris2.5.1
      として configure し、make し、インストールする。
        /usr/local/sparc-sun-solaris2.5.1/bin の下に、
          as,ld,ar 等がインストールされ、それらは
        /usr/local/bin の下の、
          sparc-sun-solaris2.5.1-as
          sparc-sun-solaris2.5.1-ld
          sparc-sun-solaris2.5.1-ar
        等として、ハードリンクされる。
  
  * Solaris2 インクルードファイルの準備。
      マウント、シンボリックリンク等の方法を使い、
      solaris2:/usr/include 以下のインクルードファイルが、
      sunos4:/usr/local/sparc-sun-solaris2.5.1/include 以下に
      見えるようにする。

  * Solaris2 ライブラリの準備。
      マウント、シンボリックリンク等の方法を使い、
      solaris2:/usr/lib 以下のライブラリが、
      sunos4:/usr/local/sparc-sun-solaris2.5.1/lib 以下に
      見えるようにする。

  * クロスコンパイラの作成。
      SunOS4 上で、gcc-2.7.2.1 を、configure --target=sparc-sun-solaris2.5.1
      で configure する。その後追加として solaris2:/usr/ccs/lib/values-Xa.o
      のみ、カレントディレクトリにコピーする。
      (Solaris2 では、crt*.o がバンドルされていないが、gcc のソースでは、
        Solaris2 用に crt*.asm というソースをちゃんと用意してくれている)
      これで準備が整ったので次のスクリプトで make を行なう。
          -----------------------------------
          #!/bin/sh -x
          (
            date
            time make -j3 LANGUAGES=c \
              CC=gcc \
              CFLAGS='-O2 -pipe -s' \
              AS=sparc-sun-solaris2.5.1-as \
              LIBGCC1_TEST=''
            date
          ) 2>&1 | tee -a stage1-log
          -----------------------------------
      ここで、AS=sparc-sun-solaris2.5.1-as と指定しているのは、
      この AS の値は crt*.asm をアセンブルする時に使われ、
      これを指定しないと、as (SunOS4ネイティブアセンブラ)が
      誤って使われてエラーになってしまうため。
        さらに、LIBGCC1_TEST='' として、libgcc1.a のテストを抑制する。
      Solaris2 では(SunOS4 でも)libgcc1.a は必要ない(libgcc2.a のみ必要)
      ということがわかっているが、クロスコンパイラの make 環境では
      libgcc1.a のテストがエラーになってしまうので、このようにする。

      make 中に Solaris2 用の fix-include も行なわれる。ただし、原理的に
      float.h の fix は正しくは行なわれない。

      以上で、make は正常に行なわれ、クロスコンパイラが作成される。

      クロスコンパイラなので、このまま(いわゆる stage1)でインストールする。
      インストール後、values-Xa.o のみ手作業で
      /usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2.1 にコピーする。
      クロスコンパイラは、コマンド名 sparc-sun-solaris2.5.1-gcc として
      または、gcc -b sparc-sun-solaris2.5.1 とオプションを付けて実行できる。

  * クロスコンパイラの簡単なテスト。
      SunOS4 上で、sparc-sun-solaris2.5.1-gcc を実行して簡単なソースを
      コンパイルしてみる。その時、-v オプションも付けてインクルードファイルや
      ライブラリ等も正しく Solaris2 用のものが参照されていることを確認する。
      クロスコンパイルした結果を Solaris2 上で実行できることを確認する。


  * クロスコンパイラを使って Solaris2.5.1 ネイティブコンパイラの作成。
      SunOS4 上の新しい作業ディレクトリで、gcc-2.7.2.1 を、
        configure --build=sparc-sun-sunos4.1.4 --host=sparc-sun-solaris2.5.1
      で configure する。

      make は以下のスクリプトで行なう。
          -----------------------------------
          #!/bin/sh -x
          (
            date
            time make -j3 LANGUAGES=c \
              CC=sparc-sun-solaris2.5.1-gcc \
              CFLAGS='-O2 -pipe -s' \
              AS=sparc-sun-solaris2.5.1-as \
              LIBGCC1_TEST=''
              GCC_FOR_TARGET=sparc-sun-solaris2.5.1-gcc 
            date
          ) 2>&1 | tee -a stage1-log
          -----------------------------------
      AS および LIBGCC1_TEST を指定するのはクロスコンパイラ作成の時と同様。
      さらに、GCC_FOR_TARGET を指定するのがポイント。
      これを指定しないと、make 中で libgcc.a 等を作成する際に、make の過程で
      出来たばかりの ./xgcc を起動しようとする。これは Solaris2 用の
      バイナリであり、SunOS4 上では当然実行出来ずエラーになってしまう。

      以上で、make は正常に行なわれ、Solaris2 ネイティブコンパイラが
      SunOS4 上で作成されたことになる。


  * そして Solaris2 へ
      これで SunOS4 上の作業をひとまず終え、Solaris2 をブートし直す。
    作成されたネイティブコンパイラは、そのままインストールしてもいいし、
    これを stage1 としてさらに stage2, stage3 を make してもいい。
    ただし、float.h の fix-include が正常に行なわれていないので、
    もう一度、fix-include し直した方がいい。
    また、gcc の再 make 時には LANGUAGES の指定を外し、C++ 等も make する。
    (最初に Solaris2 上で不自由しないように、SunOS4 上のクロスコンパイラで
      あらかじめ GNU make-3.75 等、必要なものを make しておくという
      方法も考えられる)

      さらに、Solaris2 上で binutils-2.7 を make し、それを使って
    gcc を make し直し、それを使って binutils を make し直す、、
    と、こだわることも出来る。


  * 考慮事項
    * gcc-2.7.2.1/config/sparc/t-sol2 によると、
        『crtstuff.c(crtbegin.o, crtend.o のソース)のコンパイル時に
          -fPIC を付けたいが、GNU as が PIC にまだ対応していないため、
          crtstuff.c のコンパイル時に限り、たとえ GNU as がインストール
          されていても /usr/ccs/bin/as を強制的に使う。ただし、
          クロスコンパイル時には(不可能なので)-fPIC をあきらめる』
      とあり、確かにクロスコンパイラ make 時の stage1-log を見ると -fPIC は
      使われていない。
        しかし、binutils-2.7 の as を見る限りでは PIC はサポートされて
      いるようで、それならば、Makefile を修正して crtstuff.c も -fPIC で
      コンパイルした方がいいのかも知れない。
        また、Solaris2 上でのネイティブ gcc の make 時にも、
      /usr/ccs/bin/as を一切使いたくないということであれば、同様に Makefile を
      修正して、GNU as のみが使われるようにした方がいいのかも知れない。

    * Makefile 中に、OLDCC = cc という行があり、これは libgcc1.a の
      作成の場合に使用される。しかし、SunOS4 も Solaris2 も、libgcc1.a は
      必要なく、結果的に cc は使われない。しかし、だからと言って、
      OLDCC = gcc などと書き換えてはいけない。OLDCC の値と、CC (=gcc) の値が
      Makefile の別の場所で sh の case 文で比較されていて、これが同じだと、
      alloca.o という、空のオブジェクト(実際には不要)が余分にリンク
      されてしまう。心配なら、OLDCC = xxx (あり得ないコマンド名)とでも
      すると良い。

    * gcc-2.7.2.1, binutils-2.7 等、同じソースに対し異なる configure で
      複数の make を行なう場合、ソースを展開したディレクトリはリードオンリー
      (CD-ROM 状態)にして、別の作業ディレクトリから、
         (ソースディレクトリ)/configure
      とすると良い。(今回、実際にそうした)

                                                                    以上
-----------------------------------------------------------------------------
-------------------------------
山森丈範  yamamori
-------------------------------


今は gcc-2.8.1, binutils-2.9.1 が最新です。基本的には上記の方法が使えますが、gcc-2.8.1 では一部異なるところがあります。

英語版 Free Solaris 7 で、クロスコンパイルによる gcc-2.8.1 の make ができています。
こちらも合わせて御覧下さい。


To 謎の処理系 SunOS 4.1.4 Home
yamamori