2008年8月1日金曜日

(FreeBSD) Cannot load /usr/local/libexec/apache22/mod_authnz_ldap.so into server: /usr/local/libexec/apache22/mod_authnz_ldap.so: Undefined symbol "apr_ldap_url_parse"

タイトルは、FreeBSDでportsでインストールしたapache httpdにて、しばらく前から、たまに見かけていたエラーメッセージです。



apacheは、ずっと実行しっぱなしなんですが(当然か)、あるとき、httpd.confを書き換えたりして、apacheを再起動しようとすると・・・



# /usr/local/etc/rc.d/apache22 start
Performing sanity check on apache22 configuration:
httpd: Syntax error on line 63 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_authnz_ldap.so into server: /usr/local/libexec/apache22/mod_authnz_ldap.so: Undefined symbol "apr_ldap_url_parse"
Starting apache22.
httpd: Syntax error on line 63 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_authnz_ldap.so into server: /usr/local/libexec/apache22/mod_authnz_ldap.so: Undefined symbol "apr_ldap_url_parse"



というエラーになる、と。



たぶん、apacheを起動してから、再起動するまでの間に、portupgradeで何かをアップデートしていて、それが原因なんだろう、とは思っていました。



とりあえず、「portupgrade -f apache-2.2...」で再インストールすれば直ってしまうので、まあいいか、ってことにしてたんですが、やっと原因がわかりました。



ldap_url_parseというシンボルは、libaprutil-1.so.3で定義されてます。



# nm /usr/local/lib/libaprutil-1.so.3 | grep ldap_url_parse
0000fe90 T apr_ldap_url_parse
0000f880 T apr_ldap_url_parse_ext



この共有ライブラリは、どこからきたかというと・・・



# pkg_which /usr/local/lib/libaprutil-1.so.3
apr-gdbm-db42-1.3.2 apache-2.2.9



どうして、2つも、パッケージ名が表示されるんですか?!



・・・これから、わかった原因。

apacheが起動しなくなったのは、apr-gdbm-db42-1.3.2が、後からlibaprutil-1.so.3を上書きしてしまったから

ということらしいです。



/var/db/ports/apache22/options を見てみると

WITHOUT_APR_FROM_PORTS=true

となっているのですが、これはportsでインストールするapr(上記のapr-gdbm-db42なんとか)ではなく、apache-2.2自前でaprを使います、という意味らしいです。



というわけで、単体インストールされたaprを削除する、



# pkg_delete /var/db/pkg/apr-gdbm-db42-1.3.2



というのが正解みたいです。



ただし、pkg_deleteすると、重要なファイルが削除されてしまうらしいので、めんどくさいですが、もう一度、apache22をインストールしなおさないといけませんでした。



apache22を再インストールしなかったときは、たとえば、subversionがビルドできない、というトラブルを目にしました(たしか、aprのヘッダファイルが削除されてしまったみたい)。



apr-gdbm-db42-1.3.2は、何かにrequireされてインストールされているわけでもなく、どうしてインストールされていたのかわからないのですが、以前、何かがrequireしてたけど、その後portsが修正され、依存関係がなくなってしまった、ということかもしれません。



CONFLICTの指定がないので、devel/aprと、www/apache22の両方がインストールできてしまうらしく、それがいけないですね。



(optionによって、CONFLICTしたり、しなかったり、ってのは無理なんでしょうか)





0 件のコメント:

コメントを投稿