GentooでOpenSSLを入れなおしたらエラーになった時のメモ

ある日Gentooに入れたPostfixを起動しようとしたら、こんなエラーになったのでメモがてら書いておく。

libpostfix-tls.so: undefined symbol: EC_KEY_free

原因は分かっている。OpenSSLを入れ替えたんだ。けど、USEフラグを切り替えただけで、同じ名前でライブラリがインストールされていたんです。なので revdep-rebuild しても解消されず、問題のあるパッケージを個別に emerge -1 する必要がありました。

個別に対応するのも面倒なので、指定のライブラリを使用しているパッケージを再インストールするオプションも用意されています。revdep-rebuild の -L オプションです。これでこんな感じで指定すればOpenSSLのライブラリを使用しているパッケージを全て再インストールすることができます。

~ # revdep-rebuild -L /usr/lib64/libssl.so.1.0.0 -- -a

最後の — -a は emerge コマンドに渡すオプションです。これで内容を確認してから開始することができます。ちなみに、OpenSSLは多くのパッケージから利用されているので、再インストールされるパッケージも大量になるので注意です。

ところで、そもそもなんで /usr/lib64/libssl.so.1.0.0 というライブラリが関係していると判断したかというと、こんな感じです。まずは問題の libpostfix-tls.so というライブラリの場所を特定。

~ $ equery f postfix | grep libpostfix-tls.so
/usr/lib64/postfix/3.1.0/libpostfix-tls.so

postfixのエラーなのでpostfixに含まれているだろう、という考えでした。そして、それが使用しているライブラリを確認。

~ $ ldd /usr/lib64/postfix/3.1.0/libpostfix-tls.so
        linux-vdso.so.1 (0x00007fff00b14000)
        libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x00007f4ecad5c000)
        libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x00007f4eca93a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f4eca58e000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f4eca38a000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f4eca171000)
        /lib64/ld-linux-x86-64.so.2 (0x00005586ae867000)

そう、これで /usr/lib64/libssl.so.1.0.0 が割り出されたわけです。

ちなみに /usr/lib64/libcrypto.so.1.0.0 の方はというと、こっちもOpenSSL関連のライブラリです。

~ $ equery b /usr/lib64/libssl.so.1.0.0 /usr/lib64/libcrypto.so.1.0.0
 * Searching for /usr/lib64/libssl.so.1.0.0,/usr/lib64/libcrypto.so.1.0.0 ...
dev-libs/openssl-1.0.2h-r2 (/usr/lib64/libssl.so.1.0.0)
dev-libs/openssl-1.0.2h-r2 (/usr/lib64/libcrypto.so.1.0.0)

「*」がulタグになっちゃうのが回避できなかったので全角に・・・。

そういうわけでした。

はて、このメモ、誰かの役に立つのだろうか・・・。