php5.2.14とapache2.4.3

php5.2.14とapache2.4.3でコンパイルリンクしてhttpdを動作させるとエラーになるという報告。こんなエラー。

httpd: Syntax error on line 146 of /usr/local/apache2/conf/httpd.conf: Cannot load modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: undefined symbol: unixd_config

"unixd_config"というシンボルが見えないといっています。apache2.2+php5.2.14では問題なし。apache2.4+php5.3でも問題なし。

早速ソースを調査してみる。まずphpの方。当該シンボルを使っているのは以下の一箇所だけ。
./sapi/apache2hander/php_functions.c中のPHP_MINFO_FUNCTIONという関数です。

PHP_MINFO_FUNCTION(apache)
{
        char *apv = php_apache_get_version();
        smart_str tmp1 = {0};
        char tmp[1024];
        int n, max_requests;
        char *p;
        server_rec *serv = ((php_struct *) SG(server_context))->r->server;
#if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE)
        AP_DECLARE_DATA extern unixd_config_rec unixd_config;
#endif
(中略)
#if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE)
        snprintf(tmp, sizeof(tmp), "%s(%d)/%d", ap_unixd_config.user_name, unixd_config.user_id, ap_unixd_config.group_id);
        php_info_print_table_row(2, "User/Group", tmp);
#endif

変数宣言でexternしているので、どうもapacheの外部変数を参照しているようです。
apache2.2.22のソースで当該箇所を探すとos/unix/unixd.cの54行目にありました。

unixd_config_rec unixd_config;

次にapache2.4.3の同じファイルの同じところをチェック。

unixd_config_rec ap_unixd_config;

ほう。名前が変わったんですね。構造体の中身まではチェックしていませんが。
そうすると、php側で参照している変数名をapacheに合わせればいいってことでunixd_configをap_unixd_configへ変更するパッチがこちら。

--- sapi/apache2handler/php_functions.c.orig    2012-09-07 15:15:37.403662055 +0900
+++ sapi/apache2handler/php_functions.c 2012-09-07 14:58:38.755648593 +0900
@@ -383,7 +383,7 @@
        char *p;
        server_rec *serv = ((php_struct *) SG(server_context))->r->server;
 #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE)
-       AP_DECLARE_DATA extern unixd_config_rec unixd_config;
+       AP_DECLARE_DATA extern unixd_config_rec ap_unixd_config;
 #endif

        for (n = 0; ap_loaded_modules[n]; ++n) {
@@ -414,7 +414,7 @@
        php_info_print_table_row(2, "Hostname:Port", tmp);

 #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE)
-       snprintf(tmp, sizeof(tmp), "%s(%d)/%d", unixd_config.user_name, unixd_config.user_id, unixd_config.group_id);
+       snprintf(tmp, sizeof(tmp), "%s(%d)/%d", ap_unixd_config.user_name, ap_unixd_config.user_id, ap_unixd_config.group_id);
        php_info_print_table_row(2, "User/Group", tmp);
 #endif

このパッチでphpを再makeしてinstall,httpdを再起動。

真面目に動作確認はしていませんが、httpdはちゃんと起動してくれました。修正したところはphpinfo()でユーザ名など表示させるところだと思うんだけど、phpinfo()もちゃんと見えたので多分問題ないかと思われます。