Solaris10/64bitでgcc-4.8.1

ちょっと研究ネタをやろうかと夕方3時間ぐらい粘ってみた。

こちらのページを参考に作業してみた。

http://d.hatena.ne.jp/kawa0810/20130605/1370449220
さくら VPS 上に gcc4.8 をインストールする方法

環境はSolaris10/x86_64でして、今年の春ぐらいのRecomandded patchの当たった状態です。

OSは業者さんが導入したのですが、gcc-3.4.3が/usr/sfw/bin/gccに入ってました。

上記のページの作業との大きな違いがありまして、CentOS6.*/x86_64のOS標準のコンパイラは標準で64bitのバイナリを生成します。しかしSolaris10に入ってたgccは32bitのバイナリを標準で生成します。制御には-m64オプションを使います。


$ gcc -v
Reading specs from /usr/sfw/lib/gcc/i386-pc-solaris2.10/3.4.3/specs
Configured with: /builds/sfw10-gate/usr/src/cmd/gcc/gcc-3.4.3/configure --prefix=/usr/sfw --with-as=/usr/sfw/bin/gas --with-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++ --enable-shared
Thread model: posix
gcc version 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
$ gcc tmp.c
$ file a.out
a.out: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, not stripped, no debugging information available
$ gcc -m64 tmp.c
$ file a.out
a.out: ELF 64-bit LSB executable AMD64 Version 1, dynamically linked, not stripped, no debugging information available

これ重要です。上記のWebページの通りにやる場合ですが、Solaris10/x86_64の環境でGMPコンパイルをすると、GMPのconfigureが自動的に64bit環境だと認識して64bitのライブラリを生成します。

しかしgcc-4.8.1のconfigureは自動的に64bit環境と認識せずに32bitバイナリを生成しようとします。そのためリンクに失敗します。

そのため上記Webのライブラリのコンパイル時はすべて32bitバイナリを生成するようconfigure opitonやらで工夫して下さい。そうしないとgccコンパイルでリンクに失敗します。またmakeにはgmakeコマンドを使ってください。これはGNU Makeです。これもうちの環境では最初から入ってました。

なおgccを32bitバイナリで生成しても64bbitOSならコンパイラとしては32bit版と64bit版が生成されるようです。


$ ./gcc-4.8.1 tmp.c
$ file a.out
a.out: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, not stripped, no debugging information available
$ ./gcc-4.8.1 -m64 tmp.c
$ file a.out
a.out: ELF 64-bit LSB executable AMD64 Version 1, dynamically linked, not stripped, no debugging information available

ですが、しかし、実際の研究プログラムを実行する段階ではGMPの64bitを使いたいという状況も発生すると思います。そのため、/usr/local/libあたりにgcc-4.8.1のインストールのためのGMPの32bitライブラリを置くのは賢明ではありません。

専用のディレクトリを掘って、そこにインストールするようにライブラリおよびgccのconfigure時に--prefix=/usr/local/gcc-4.8.1と指定するのが良いでしょう。

しかし--prefixで/usr/local以外の場所にライブラリをインストールすると、configureが自動でライブラリを発見できません。そのため、ライブラリのコンパイル時にconfigureに沢山オプションを付ける必要があります。そのあたりは試行錯誤が必要かと思います。がんばって下さい。