FrontPage

phpの再コンパイル

debianのphp(mod-phpも)は外部GDライブラリを使用するようにコンパイルされているため、ビルトインGDライブラリでしか使えない一部のgd関数を使用できない。
そこで、再コンパイルすることにする

# apt-get source libapache2-mod-php5
# apt-get build-dep libapache2-mod-php5
# cd php5-5.2.0/
# vi debian/rules
-with-gdの行を探し、"=shared,/usr"を削る
# debian/rules binary
# cd ..
# dpkg -i libapache2-mod-php5_*.deb
# dpkg -i php5_*.deb

あと/etc/php5/conf.d/gd.iniが存在したら

extension=gd.so

をコメントアウトしておくこと。

Debian r5/lennyの場合

なぜか RFC822BUFFER undeclared.というエラーが出たので調べてみた。
どうやらlibc-client-devパッケージに入っているらしい。/usr/include/c-client/rfc822.hで定義されている。
もしかするとmod_php5をholdしていたせいでupgradeされていなかったのかも知れないので、いったんremoveして再度install

# apt-get remove libc-client-dev
# apt-get install libc-client-dev
# grep RFC822BUFFER /usr/include/c-client/rfc822.h
} RFC822BUFFER;
typedef long (*rfc822outfull_t) (RFC822BUFFER *buf,ENVELOPE *env,BODY *body,
long rfc822_output_full (RFC822BUFFER *buf,ENVELOPE *env,BODY *body,long ok8);
long rfc822_output_flush (RFC822BUFFER *buf);
long rfc822_output_header (RFC822BUFFER *buf,ENVELOPE *env,BODY *body,
long rfc822_output_header_line (RFC822BUFFER *buf,char *type,long resent,
long rfc822_output_address_line (RFC822BUFFER *buf,char *type,long resent,
long rfc822_output_address_list (RFC822BUFFER *buf,ADDRESS *adr,long pretty,
long rfc822_output_address (RFC822BUFFER *buf,ADDRESS *adr);
long rfc822_output_cat (RFC822BUFFER *buf,char *src,const char *specials);
long rfc822_output_parameter (RFC822BUFFER *buf,PARAMETER *param);
long rfc822_output_stringlist (RFC822BUFFER *buf,STRINGLIST *stl);
long rfc822_output_body_header (RFC822BUFFER *buf,BODY *body);
long rfc822_output_text (RFC822BUFFER *buf,BODY *body);

ついでに確認

# ls php5-5.2.6.dfsg.1/ext/gd/libgd/gd_secutiry.c
gd_security.c

etchで欠けていたファイルがちゃんとある。
現在コンパイル中コンパイルできた。

# dpkg -i ../libapache2-mod-php5_5.2.6.dfsg.1-1+lenny2_i386.deb

Debian r4/etchでコンパイルに失敗する

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=506706

だそうで・・・仕方ないので何とか補完する。

php5-5.2.0/ext/gd/libgd/gd_security.cを作成

/*
 * gd_security.c
 *
 * Implements buffer overflow check routines.
 *
 * Written 2004, Phil Knirsch.
 * Based on netpbm fixes by Alan Cox.
 *
 */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "gd.h"
int overflow2(int a, int b) {
        if(a <= 0 || b <= 0) {
                php_gd_error("gd warning: one parameter to a memory allocation multiplication is negative or zero, failing operation gracefully\n");
                return 1;
        }
        if(a > INT_MAX / b) {
                php_gd_error("gd warning: product of memory allocation multiplication would exceed INT_MAX, failing operation gracefully\n");
                return 1;
        }
        return 0;
}

php5-5.2.0/ext/gd/config.m4を修正

                libgd/gdfontg.c libgd/gdtables.c libgd/gdft.c libgd/gdcache.c libgd/gdkanji.c \
                libgd/wbmp.c libgd/gd_wbmp.c libgd/gdhelpers.c libgd/gd_topal.c libgd/gd_gif_in.c \
                libgd/xbm.c libgd/gd_gif_out.c libgd/gd_security.c"

で、コンパイルしなおし

# debian/rule clean
# debian/rule binary

パッケージのホールド

このままだとapt-get upgrade等で既存のパッケージによって上書きされてしまうため、パッケージをhold状態にしておく。

echo libapache2-mod-php5 hold | dpkg --set-selections

ただし、新しいパッチがあたってphp5パッケージのバージョンがあがってもapt-getではインストールされなくなるので注意。(どのみち上記の症状が改善されない限り、パッチを当て続ける必要があるが・・・)
通常パッケージでの更新を行うときは以下のようにする

 echo libapache2-mod-php5 install | dpkg --set-selections

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-04 (土) 15:15:33 (430d)