EVP_md2 symbol error
phpをssl対応にしてくれという要望。当該サーバにはOpenSSLが入っていなかったので、最新のソースを入手してコンパイル、リンク、インストール。
$ /usr/local/bin/tar -zxvf openssl-1.0.0f.tar.gz $ cd openssl-1.0.0f/ $ config shared $ /usr/local/bin/make # /usr/local/bin/make install
それでもって、phpのソースで --with-openssl=/usr/local/ssl をつけてconfigure,make。
$ configure (中略) --with-openssl=/usr/local/ssl $ /usr/local/bin/make (中略) Undefined first referenced symbol in file EVP_md2 ext/openssl/.libs/openssl.o ld: fatal: Symbol referencing errors. No output written to sapi/cli/php collect2: ld returned 1 exit status make: *** [sapi/cli/php] Error 1 $
なんだ?リンクでなにかエラーが。どれどれ。EVP_md2ってなシンボルが見つかりませんよ。と言っている。
OpenSSL側のソースを探ると、このシンボルは crypto/evp/m_md2.cにありました。ソースはこんな感じです。
(前略) #include <stdio.h> #include "cryptlib.h" #ifndef OPENSSL_NO_MD2 #include <openssl/evp.h> #include <openssl/objects.h> #include <openssl/x509.h> #include <openssl/md2.h> #ifndef OPENSSL_NO_RSA #include <openssl/rsa.h> #endif (中略) const EVP_MD *EVP_md2(void) { return(&md2_md); } #endif
ふむ。このファイルがコンパイルされたm_md2.oを除いてみても空っぽ。ソースから判断すると、OPENSSL_NO_MD2というデファインがあると、なにもしないってことになっています。
OpenSSLのCHANGESを参照すると、1.0.0からmd2はデフォルトで無効になりましたってなことが書いてありました。なので、なにも指定しないでconfigをかけるとOPENSSL_NO_MD2の定義が有効になるのでしょう*1。
*) Disable MD2 in the default configuration. [Steve Henson]
ああ、そうすか。
ということでmd2を有効にして再度OpenSSLをコンパイル、リンク。
$ ./config enable-md2 shared $ /usr/local/bin/make # /usr/local/bin/make install
でもって、再度php側でmakeして終了。
*1:make時のログをみると、ちゃんと-DOPENSS_OPENSSL_MD2ってのがありました。