Solaris 10 で Apache 2.2.2 を 64bit対応にてコンパイルする
やー、できたできた。たいへんだった。
まず、32bitでコンパイルして同じPrefixにインストールした物が存在する状態で、64bitコンパイルをしようとすると、src/support/のあたりのmake時に、インストール済み(32bit)のlibaprutil-1.soをリンクしようとするのでコンパイルできません。-Lを工夫するか、インストール済みのものを消すなり動かすなりすること。(これはconfigureやらMakefileのバグとも思えるけど、仕様とも言える話)
ともあれ、以下、Solaris10でApache2.2.2を64bitでコンパイルする件。
$ PATH=$PATH":/usr/sfw/bin:/usr/ccs/bin:/usr/ucb" $ export PATH $ env CC="gcc -m64" ./configure \ --enable-mods-shared=all \ --enable-so \ --enable-cache \ --enable-mem-cache \ --enable-proxy \ --enable-proxy-connect \ --enable-proxy-http \ --enable-proxy-balancer \ --with-mpm=worker
コンパイルに必要なツール類は/usr/binには入っていないので、PATH変数を書き換えてから ./configure を走らせる。この時、コンパイラ gcc に -m64オプションを与えるのがキモ。ちょい最適化バイナリで小娘を蹴散らせ!(ニキータ風)
作ろうとしているのはキャッシュができるプロキシサーバ。ロードバランシングまで出来たら最強だよね、みたいな実験サーバだけど、ここでは触れない事にする。(気が向いたらまた今度)
さて、こんな要領でコンパイルすると、たぶんコンパイルはできる。だけど、これだけじゃ終わらないんだね。
$ ./httpd -V ld.so.1: httpd: fatal: /usr/sfw/lib/libgcc_s.so.1: wrong ELF class: ELFCLASS32 Killed
64bitになったかなー?と、出来上がったhttpdに-Vを食わせて実行しようとすると、この有様。libgccが32bitだから使えないってことなんだけれど、じゃぁ何でコンパイルできたんだ?
答えはダイナミックリンクをやるライブラリの優先順位っていうのかね。/usr/sfw/libでないところにある64bitのlibgccを使うように小細工が必要ってわけ。
$ env LD_LIBRARY_PATH=/usr/sfw/lib/sparcv9 ./httpd -V Server version: Apache/2.2.2 Server built: May 22 2006 21:46:27 Server's Module Magic Number: 20051115:2 Server loaded: APR 1.2.7, APR-Util 1.2.7 Compiled using: APR 1.2.7, APR-Util 1.2.7 Architecture: 64-bit Server MPM: Worker threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... (省略)
結果、Architecture: 64-bit になった。やったね!!