EVP_md2 symbol error

phpssl対応にしてくれという要望。当該サーバには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ってのがありました。