Linking PHP with static Libtool libraries
| From: | Adam Dickmeiss | Date: | Fri, 14 Dec 2001 16:55:02 +0000 |
| Subject: | Linking PHP with static Libtool libraries | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-73762@lists.php.net to get a copy of this message | ||
I have the following problem. On UNIX, PHP fails to link with
a static library generated by Libtool. Problem occurs with PHP 4.1.0
but not PHP 4.0.6. The YAZ extension, for example, which I maintain
generates by default a static Libtool library only. So After doing
cd yaz-1.8.3
./configure --prefix=/usr
make
make install
two files are created, namely /usr/lib/libyaz.a and /lib/lib/libyaz.la.
For PHP I do :
./configure --with-yaz [other options]
and get the folloing make output:
..
/bin/sh ../libtool --silent --mode=link gcc -g -O2 -prefer-pic -o libZend.la -ldl -lyaz -lcrypt
-lresolv -lm -ldl -lnsl -lresolv
-lcrypt zend_language_parser.lo zend_language_scanner.lo zend_ini_parser.lo zend_ini_scanner.lo
zend_alloc.lo zend_compile.lo zend_c
onstants.lo zend_dynamic_array.lo zend_execute.lo zend_execute_API.lo zend_highlight.lo
zend_llist.lo zend_opcode.lo zend_operators.l
o zend_ptr_stack.lo zend_stack.lo zend_variables.lo zend.lo zend_API.lo zend_extensions.lo
zend_hash.lo zend_list.lo zend_indent.lo z
end_builtin_functions.lo zend_sprintf.lo zend_ini.lo
make[1]: Leaving directory `/home/adam/proj/php-4.1.0/Zend'
...
/bin/sh /home/adam/proj/php-4.1.0/libtool --silent --mode=link gcc -I. -I/home/adam/proj/php-4.1.0/
-I/home/adam/proj/php-4.1.0/main
-I/home/adam/proj/php-4.1.0 -I/home/adam/proj/apache/include -I/home/adam/proj/php-4.1.0/Zend
-I/home/adam/proj/php-4.1.0/ext/mysql/
libmysql -I/home/adam/proj/php-4.1.0/ext/xml/expat -DLINUX=22 -DUSE_HSREGEX -DUSE_EXPAT
-I/home/adam/proj/php-4.1.0/TSRM -g -O2 -pre
fer-pic -o libphp4.la -rpath /home/adam/proj/php-4.1.0/libs -avoid-version stub.lo
Zend/libZend.la sapi/apache/libsapi.la main/l
ibmain.la regex/libregex.la ext/mysql/libmysql.la ext/pcre/libpcre.la ext/posix/libposix.la
ext/session/libsession.la ext/standard/li
bstandard.la ext/xml/libxml.la ext/yaz/libyaz.la TSRM/libtsrm.la -ldl -lyaz -lcrypt -lresolv -lm
-ldl -lnsl -lresolv -lcrypt
/usr/lib/libyaz.a(odr_bool.o): In function `odr_bool':
/home/adam/proj/yaz/odr/odr_bool.c(.text+0x0): multiple definition of `odr_bool'
Zend/.libs/libZend.al(odr_bool.o)(.text+0x0):/home/adam/proj/yaz/odr/odr_bool.c: first defined here
/usr/lib/libyaz.a(ber_bool.o): In function `ber_boolean':
[many more multiple symbols]
The log indicates that all YAZ symbols are included twice. Apparenly the
Zend link step includes YAZ verbatim even though NO symbols should be needed
to built that.
Solutions / work-arounds:
1) removing /usr/lib/libyaz.la makes it work. Suddenly, the Zend link step
doesn't include YAZ so everything is fine. Libtool bug?
2) removing the linkage of yaz from the Zend link step obviously makes it
work too.
3) build shared YAZ objects is a fix too. (./configure --enabled-shared for YAZ).
The problem doesn't occur with PHP 4.0.6. Probably due to the fact that
it uses libtool 1.3.5.
The problem currently only exists with YAZ (I guess most other packages
are shared objects ONLY). But it would really be convenient if extensions
could use static libraries as well.
If this is a libtool bug and there's no easy fix for that, my suggestion would be
that Zend doesn't link with YAZ or other extension libraries. Fix 2) above.
-- Adam
--
Adam Dickmeiss mailto:adam@indexdata.dk http://www.indexdata.dk
Index Data T: +45 33410100 Mob.: 212 212 66