ある日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タグになっちゃうのが回避できなかったので全角に・・・。
そういうわけでした。
はて、このメモ、誰かの役に立つのだろうか・・・。