Solaris10 x86で64ビット

Bindですが、さっくりコンパイルする分には問題なかったのですが、
真面目に環境作ろうとすると、ちょっとつまずいたので。

どうせなら、OpenSSLも最新にしてやろうという考えだったんですが。

sunfreeware.comからダウンロードしたgcc3.4.6はどうも32ビット版のようで、OpenSSLのインストールが失敗する。

OpenSSL0.9.8k
$ ./config
$ gmake
gcc -I. -I.. -I../include -DOPENSSL_THREADS ¥
    -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H ¥
    -m64 -O3 -Wall -DL_ENDIAN ¥
    -DMD32_REG_T=int -DOPENSSL_BN_ASM_MONT ¥
    -DSHA1_ASM -DSHA256_ASM ¥
    -DSHA512_ASM -DMD5_ASM -DAES_ASM  ¥
    -c -o cryptlib.o cryptlib.c
cryptlib.c:1: sorry, unimplemented: 64-bit mode not compiled in
gmake[1]: *** [cryptlib.o] Error 1
gmake[1]: Leaving directory `/usr/local/src/openssl-0.9.8k/crypto'
gmake: *** [build_crypto] Error 1
これは標準でインストールされているgcc(3.4.3)では、32ビット版と64ビット版のバイナリがどちらも生成できるようになっているので、不要なgccをアンインストールして対処。
$ sudo pkgrm SMCgcc
OpenSSL0.9.8k
$ ./config
$ gmake
$ sudo gmake install
で、OpenSSLのインストール完了。

この64ビット版と32ビット版の違いというヤツがbindでハマルもとになるのですが。

BIND 9.6.0-P1
$ ./configure --prefix=/usr/local/bind
checking for OpenSSL library... using OpenSSL from
/usr/local/ssl/lib and /usr/local/ssl/include
checking whether linking with OpenSSL works... no
configure: error: Could not run test program using OpenSSL from
/usr/local/ssl/lib and /usr/local/ssl/include.
Please check the argument to --with-openssl and your
shared library configuration (e.g., LD_LIBRARY_PATH).
でOpenSSLのライブラリが見つからないと言っているので、
crle(Linuxで言うldconfigのようなコマンド)でOpenSSLのライブラリを追加した。(まずここが間違っている・・・crleで設定するのはデフォルトでは32ビットのライブラリ検索パス)
$ crle

構成ファイル [バージョン 4]: /var/ld/ld.config
  デフォルトライブラリパス (ELF):   /lib:/usr/lib:/usr/local/ssl/lib
  トラステッドディレクトリ (ELF):   /lib/secure:/usr/lib/secure  (システムデフォルト)

コマンド行:
  crle -c /var/ld/ld.config -l /lib:/usr/lib:/usr/local/ssl/lib
そして再び実行。

BIND 9.6.0-P1
$ ./configure --prefix=/usr/local/bind
checking for OpenSSL library... using OpenSSL from /usr/local/ssl/lib and /usr/local/ssl/include
checking whether linking with OpenSSL works... no
configure: error: Could not run test program using OpenSSL from
/usr/local/ssl/lib and /usr/local/ssl/include.
Please check the argument to --with-openssl and your
shared library configuration (e.g., LD_LIBRARY_PATH).
当たり前ですが、結果同じ。
crleじゃなくて、エラーメッセージ通りにLD_LIBRARY_PATHを設定しても

BIND 9.6.0-P1
$ export LD_LIBRARY_PATH=/usr/local/ssl/lib:/usr/local/lib:/usr/lib:/lib:
$ ./configure --prefix=/usr/local/bind
checking for OpenSSL library... using OpenSSL from /usr/local/ssl/lib and /usr/local/ssl/include
checking whether linking with OpenSSL works... no
configure: error: Could not run test program using OpenSSL from
/usr/local/ssl/lib and /usr/local/ssl/include.
Please check the argument to --with-openssl and your
shared library configuration (e.g., LD_LIBRARY_PATH).
やっぱり結果同じ。

このままだらだら調べても時間の無駄なので、config.logを眺めてみる事に。めんどくさいですが。

| #include <openssl/err.h>
| int main() {
|       ERR_clear_error();
|       return (0);
| }
|
configure:6152: result: no
configure:6157: error: Could not run test program using OpenSSL from
/usr/local/ssl/lib and /usr/local/ssl/include.
Please check the argument to --with-openssl and your
shared library configuration (e.g., LD_LIBRARY_PATH).
やはりsslのライブラリが無いと言っている・・・。(当然 /usr/local/ssl/libを見るとライブラリはある)

ここまで来て、やっとBINDが32ビットでコンパイルされている事に気がついたのですが。
ライブラリの検索パスから、全部設定するのかぁ。。。

crleも-64を指定することで64ビットライブラリの検索パスが指定できるので。
$ crle -64

デフォルト構成ファイル(/var/ld/64/ld.config) が見つかりません
  デフォルトライブラリパス (ELF):   /lib/64:/usr/lib/64  (システムデフォルト)
  トラステッドディレクトリ (ELF):   /lib/secure/64:/usr/lib/secure/64  (システムデフォルト)
当然未設定なので、設定して。
$ sudo crle -64 -c /var/ld/64/ld.config -l /lib/64:/usr/lib/64:/usr/local/ssl/lib
gccに64ビットのオプション(-m64)を追加してコンパイル。
BIND 9.6.0-P1
$ CFLAGS="-m64" ./configure --prefix=/usr/local/bind --enable-ipv6=no
$ gmake
$ sudo gmake install
結局、環境構築の問題だった訳ですが。
OpenSSLが64ビットでコンパイルされたって事は、他も全部そうしなきゃいけないって事で。実は大問題だったり・・・。

ちなみにSPARC機の場合はOpenSSLはデフォルトでは32ビットでコンパイルされるので、気を遣わなくて良いです。
64ビットでコンパイルする場合は逆に
$ ./Configure solaris64-sparcv9-gcc
と明示指定する必要があります。