When compiling PHP into Apache as static module Apache configure will complain about an undefined symbol in librecode. You need recode-3.6 (e.g. on ftp://ftp.gnu.org/pub/gnu/recode/) to get rid of this error. It doesn't matter if you're compiling PHP as DSO.
I tried to compile php 4.3.2-RC2 (+some older versions) with recode AND imap (and gd+png+jpeg support, ldap, gettext, zlib .. but these are not interesting right now).
Why? I needed to run Imp + Horde + Turba. Turba talks to LDAP directory (and LDAP uses utf-8 encoding which I need to convert to iso-8859-2), so I modified Turba to use 'recode' for charset conversions utf8<->iso8859-2.
System: FreeBSD4.7+Apache 1.3.27+Ben SSL
I either could not properly compile OR after compiling apache coredumped.
Problem was: imap (libc-client) and recode (librecode) use the same function hash_lookup(). Therefore during loading libphp.so (and libraries it depended on) whole apache crashed. Without a word of what's going on.
The problem is detectable by forcing static linking (in FreeBSD modify librecode.la and change
library_names='librecode.so.0 librecode.so librecode.so'
to
library_names='librecode.a'
Now during linking of php the linker complains of double definition of hash_lookup.
Solution:
-grab recode3.6 from ftp://ftp.gnu.org/pub/gnu/recode/
-unpack, go to src, in files combine.c, hash.c, names.c, recode.c, testdump.c, html.c, hash.h replace hash_lookup() by hash_lookupX() [or invent some better name],
compile recode (i had to do:
setenv CFLAGS "-I/usr/local/include"
setenv LDFLAGS "-L/usr/local/lib -lintl"
./configure --prefix=/usr/local/recode --exec-prefix=/usr/local/recode --without-included-gettext
make
make check
make install
(recode is installed to /usr/local/recode.You can change this and you can force static linking of recode, so that after building libphp.so this modified recode is no longer needed and can be deleted! )
For some reason this recode needs to have externally defined
int error;
therefore we have to modify configure script +one .c php source file:
1. modify configure script of php: find
recode_format_table();
and somewhere before start of main() add
int error;
so the result is:
char *program_name;
int error;
int main() {
recode_format_table();
; return 0; }
(I modified both occurences of recode_format_table() in configure of php4.3.2rc2)
2. run configure, should work ok (my another problem was with imap: though my c-client was compiled WITHOUT ssl, configure complained that it IS using ssl, so i had to edit configure once again and comment following lines:
void mm_searched(void){}
void mm_expunged(void){}
// char ssl_onceonlyinit(); --- commented
int main() {
// ssl_onceonlyinit(); --- commented
return 0;
}
Now configure was rather happy :-)
for the record: I did
./configure --with-apxs=/usr/local/apache/bin/apxs --with-imap --enable-sysvsem --enable-sysvshm --with-sybase=/usr/local/freetds --with-gettext --with-ldap --with-zlib --with-recode=/usr/local/recode -with-gd=/usr/local --with-jpeg-dir=/usr/local --with-png-dir=/usr/local
3. edit ext/recode/recode.c (or any other .c source file, add somewhere (e.g. at the end)
int error;
without it during linking 'error not defined' will be complained.
4. do 'make' and php is yours :-)
It took me 2 days.. so do not delete this note, someone might even find it useful and mail me his thanks :-]
I have problems with php5-recode and php5-odbc. With both packages installed, odbc_execute() hangs up causing Segmentation Fault. I was using a simple script to test that:
<?php #DSN "mydb" with a user and password "marin" $connect = odbc_connect("myaccess", "", "");
# query the users table for name and surname $query = "SELECT * FROM FRT_NAME";
# perform the query $result = odbc_exec($connect, $query);
# fetch the data from the database while(odbc_fetch_row($result)){ $name = odbc_result($result, 2);
print("$name\n");
}
# close the connection odbc_close($connect); ?>
After uninstalling php5-recode, the issue is solved.
Коментарии
When compiling PHP into Apache as static module Apache configure will complain about an undefined symbol in librecode. You need recode-3.6 (e.g. on ftp://ftp.gnu.org/pub/gnu/recode/) to get rid of this error. It doesn't matter if you're compiling PHP as DSO.
Hope this might help someone:
I tried to compile php 4.3.2-RC2 (+some older versions) with recode AND imap (and gd+png+jpeg support, ldap, gettext, zlib .. but these are not interesting right now).
Why? I needed to run Imp + Horde + Turba. Turba talks to LDAP directory (and LDAP uses utf-8 encoding which I need to convert to iso-8859-2), so I modified Turba to use 'recode' for charset conversions utf8<->iso8859-2.
System: FreeBSD4.7+Apache 1.3.27+Ben SSL
I either could not properly compile OR after compiling apache coredumped.
Problem was: imap (libc-client) and recode (librecode) use the same function hash_lookup(). Therefore during loading libphp.so (and libraries it depended on) whole apache crashed. Without a word of what's going on.
The problem is detectable by forcing static linking (in FreeBSD modify librecode.la and change
library_names='librecode.so.0 librecode.so librecode.so'
to
library_names='librecode.a'
Now during linking of php the linker complains of double definition of hash_lookup.
Solution:
-grab recode3.6 from ftp://ftp.gnu.org/pub/gnu/recode/
-unpack, go to src, in files combine.c, hash.c, names.c, recode.c, testdump.c, html.c, hash.h replace hash_lookup() by hash_lookupX() [or invent some better name],
compile recode (i had to do:
setenv CFLAGS "-I/usr/local/include"
setenv LDFLAGS "-L/usr/local/lib -lintl"
./configure --prefix=/usr/local/recode --exec-prefix=/usr/local/recode --without-included-gettext
make
make check
make install
(recode is installed to /usr/local/recode.You can change this and you can force static linking of recode, so that after building libphp.so this modified recode is no longer needed and can be deleted! )
For some reason this recode needs to have externally defined
int error;
therefore we have to modify configure script +one .c php source file:
1. modify configure script of php: find
recode_format_table();
and somewhere before start of main() add
int error;
so the result is:
char *program_name;
int error;
int main() {
recode_format_table();
; return 0; }
(I modified both occurences of recode_format_table() in configure of php4.3.2rc2)
2. run configure, should work ok (my another problem was with imap: though my c-client was compiled WITHOUT ssl, configure complained that it IS using ssl, so i had to edit configure once again and comment following lines:
void mm_searched(void){}
void mm_expunged(void){}
// char ssl_onceonlyinit(); --- commented
int main() {
// ssl_onceonlyinit(); --- commented
return 0;
}
Now configure was rather happy :-)
for the record: I did
./configure --with-apxs=/usr/local/apache/bin/apxs --with-imap --enable-sysvsem --enable-sysvshm --with-sybase=/usr/local/freetds --with-gettext --with-ldap --with-zlib --with-recode=/usr/local/recode -with-gd=/usr/local --with-jpeg-dir=/usr/local --with-png-dir=/usr/local
3. edit ext/recode/recode.c (or any other .c source file, add somewhere (e.g. at the end)
int error;
without it during linking 'error not defined' will be complained.
4. do 'make' and php is yours :-)
It took me 2 days.. so do not delete this note, someone might even find it useful and mail me his thanks :-]
I see that the Recode (3.6) module is also incompatible with the MySQL module as well as the others noted in the "warning" note above.
I have problems with php5-recode and php5-odbc. With both packages installed, odbc_execute() hangs up causing Segmentation Fault. I was using a simple script to test that:
<?php
#DSN "mydb" with a user and password "marin"
$connect = odbc_connect("myaccess", "", "");
# query the users table for name and surname
$query = "SELECT * FROM FRT_NAME";
# perform the query
$result = odbc_exec($connect, $query);
# fetch the data from the database
while(odbc_fetch_row($result)){
$name = odbc_result($result, 2);
print("$name\n");
}
# close the connection
odbc_close($connect);
?>
After uninstalling php5-recode, the issue is solved.