Hrm.. Ok, so the problem isn't as clearcut as I thought.  A walkthrough:

Install the gd-1.8.x and gd-devel-1.8.x packages on some common Linux
distro.  I am using an old rh-7.1 box with a bunch of upgraded packages
here.  Make sure it installs a /usr/lib/libgd.so

Then download gd-2.0.1.tar.gz from boutell.com and build it in /some/dir
by changing GD's Makefile's LIBS line to:

LIBS=libgd.a -lpng -lz -ljpeg -lfreetype -lm

And type:

make libgd.a

to get the static library.

Now with a clean php-4.2.0-dev checkout do:

./configure --with-gd=/home/rasmus/gd-2.0.1 --with-png-dir=/usr \
            --with-zlib --with-freetype-dir=/usr --enable-gd-native-ttf \
            --enable-gd-imgstrttf --with-jpeg-dir=/usr
make
./php -v

and it *works*...  Weird.

also if I just add --with-apxs to the above it still works.

Running ldd on libphp4.so at this point gives me:

~/php4> ldd .libs/libphp4.so
        libdl.so.2 => /lib/libdl.so.2 (0x40178000)
        libpam.so.0 => /lib/libpam.so.0 (0x4017c000)
        libpng.so.2 => /usr/lib/libpng.so.2 (0x40184000)
        libz.so.1 => /usr/lib/libz.so.1 (0x401a5000)
        libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x401b4000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x401d3000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x40200000)
        libm.so.6 => /lib/libm.so.6 (0x40212000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x40234000)
        libc.so.6 => /lib/libc.so.6 (0x4024b000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

The final link line for this working build was:

/bin/sh /home/rasmus/php4/libtool --silent --mode=link gcc  -I.
-I/home/rasmus/php4/ -I/home/rasmus/php4/main -I/home/rasmus/php4
-I/usr/include/apache -I/home/rasmus/php4/Zend -I/home/rasmus/gd-2.0.1/
-I/home/rasmus/php4/ext/mysql/libmysql -I/home/rasmus/php4/ext/xml/expat
-DLINUX=22 -DEAPI -DEAPI_MM -DEAPI_MM_CORE_PATH=/var/run/httpd.mm
-I/home/rasmus/php4/TSRM -g -O2 -prefer-pic   -o libphp4.la -rpath
/home/rasmus/php4/libs -avoid-version -L/home/rasmus/gd-2.0.1/  -R
/home/rasmus/gd-2.0.1/ stub.lo  Zend/libZend.la sapi/apache/libsapi.la
main/libmain.la regex/libregex.la /home/rasmus/php4/ext/zlib/libzlib.la
/home/rasmus/php4/ext/gd/libgd.la /home/rasmus/php4/ext/mysql/libmysql.la
/home/rasmus/php4/ext/overload/liboverload.la
/home/rasmus/php4/ext/pcre/libpcre.la
/home/rasmus/php4/ext/posix/libposix.la
/home/rasmus/php4/ext/session/libsession.la
/home/rasmus/php4/ext/standard/libstandard.la
/home/rasmus/php4/ext/xml/libxml.la TSRM/libtsrm.la -lpam -lgd -lpng -lz
-ljpeg -lz -lcrypt -lresolv -lm -ldl -lnsl -lresolv -lcrypt -ldl

Looks good.  We have a -L/home/rasmus/gd-2.0.1/  -R /home/rasmus/gd-2.0.1/
there.

Now, here comes the problem.  Try building using:

./configure --with-pdflib=/usr/local --with-gd=/home/rasmus/gd-2.0.1 \
            --with-jpeg-dir=/usr --with-freetype-dir=/usr \
            --enable-gd-native-ttf' --enable-gd-imgstrttf \
            --with-jpeg-dir=/usr --with-png-dir=/usr \
            --with-xpm-dir=/usr/X11R6 --enable-exif \
            --with-config-file-path=/etc --enable-debug \
            --with-mysql=/usr --enable-inline-optimization \
            --with-pgsql=/usr --with-zlib-dir=/usr \
            --with-expat=/usr --enable-xslt --with-xslt-sablot=/usr \
            --with-imap --with-gettext --with-kerberos --with-imap-ssl \
            --with-mcrypt=/usr/local --with-ldap \
            --with-pspell --with-apxs=/usr/sbin/apxs

gives me:

Cannot load /usr/lib/apache/libphp4.so into server:
/usr/lib/apache/libphp4.so: undefined symbol: gdImageColorClosestAlpha

And the ldd clearly shows that the wrong libgd.so.1.8 is now suddenly
being pulled in.  What happened?  Why did adding a bunch of other stuff
suddenly switch me from using /home/rasmus/gd-2.0.1/libgd.a to using
/usr/lib/libgd.so.1.8 ?

~/php4/.libs> ldd libphp4.so
        libdl.so.2 => /lib/libdl.so.2 (0x4029f000)
        libpam.so.0 => /lib/libpam.so.0 (0x402a3000)
        libcrypto.so.2 => /lib/libcrypto.so.2 (0x402ab000)
        libssl.so.2 => /lib/libssl.so.2 (0x40382000)
        libsablot.so.0 => /usr/local/lib/libsablot.so.0 (0x403b3000)
        libexpat.so.0 => /usr/lib/libexpat.so.0 (0x4045f000)
        libpspell.so.4 => /usr/lib/libpspell.so.4 (0x4047d000)
        libpq.so.2 => /usr/lib/libpq.so.2 (0x40497000)
        libpdf.so.1 => /usr/local/lib/libpdf.so.1 (0x404a7000)
        libz.so.1 => /usr/lib/libz.so.1 (0x40532000)
        libpng.so.2 => /usr/lib/libpng.so.2 (0x40541000)
        libmcrypt.so.4 => /usr/local/lib/libmcrypt.so.4 (0x40562000)
        libltdl.so.3 => /usr/local/lib/libltdl.so.3 (0x40568000)
        libldap.so.2 => /usr/lib/libldap.so.2 (0x4056e000)
        liblber.so.2 => /usr/lib/liblber.so.2 (0x40597000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x405a1000)
        libgd.so.1.8 => /usr/lib/libgd.so.1.8 (0x405cf000)
        libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40602000)
        libXpm.so.4 => /usr/X11R6/lib/libXpm.so.4 (0x406f8000)
        libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40707000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x40726000)
        libm.so.6 => /lib/libm.so.6 (0x40738000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x4075b000)
        libgssapi_krb5.so.2 => /usr/kerberos/lib/libgssapi_krb5.so.2 (0x40772000)
        libkrb5.so.3 => /usr/kerberos/lib/libkrb5.so.3 (0x40785000)
        libk5crypto.so.3 => /usr/kerberos/lib/libk5crypto.so.3 (0x407dd000)
        libcom_err.so.2 => /lib/libcom_err.so.2 (0x407ee000)
        libc.so.6 => /lib/libc.so.6 (0x407f1000)
        libpspell-modules.so.1 => /usr/lib/libpspell-modules.so.1 (0x40927000)
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x40929000)
        libsasl.so.7 => /usr/lib/libsasl.so.7 (0x4096c000)
        libcom_err.so.3 => /usr/kerberos/lib/libcom_err.so.3 (0x40976000)
        libssl.so.1 => /usr/lib/libssl.so.1 (0x40979000)
        libcrypto.so.1 => /usr/lib/libcrypto.so.1 (0x409a5000)
        libttf.so.2 => /usr/lib/libttf.so.2 (0x40a62000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
        libgdbm.so.2 => /usr/lib/libgdbm.so.2 (0x40a8c000)

The final link line for this one was:

gcc -shared  stub.lo -Wl,--whole-archive Zend/.libs/libZend.al
sapi/apache/.libs/libsapi.al main/.libs/libmain.al regex/.libs/libregex.al
/home/rasmus/php4/ext/zlib/.libs/libzlib.al
/home/rasmus/php4/ext/exif/.libs/libexif.al
/home/rasmus/php4/ext/gd/.libs/libgd.al
/home/rasmus/php4/ext/gettext/.libs/libgettext.al
/home/rasmus/php4/ext/imap/.libs/libimap.al
/home/rasmus/php4/ext/ldap/.libs/libldap.al
/home/rasmus/php4/ext/mcrypt/.libs/libmcrypt.al
/home/rasmus/php4/ext/mysql/.libs/libmysql.al
/home/rasmus/php4/ext/overload/.libs/liboverload.al
/home/rasmus/php4/ext/pcre/.libs/libpcre.al
/home/rasmus/php4/ext/pdf/.libs/libpdf.al
/home/rasmus/php4/ext/pgsql/.libs/libpgsql.al
/home/rasmus/php4/ext/posix/.libs/libposix.al
/home/rasmus/php4/ext/pspell/.libs/libpspell.al
/home/rasmus/php4/ext/session/.libs/libsession.al
/home/rasmus/php4/ext/standard/.libs/libstandard.al
/home/rasmus/php4/ext/xml/.libs/libxml.al
/home/rasmus/php4/ext/xslt/.libs/libxslt.al TSRM/.libs/libtsrm.al
/usr/lib/mysql/libmysqlclient.a -Wl,--no-whole-archive  -Wl,--rpath
-Wl,/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath
-Wl,/usr/X11R6/lib -Wl,--rpath -Wl,/home/rasmus/gd-2.0.1/ -Wl,--rpath
-Wl,/usr/kerberos/lib -Wl,--rpath -Wl,/usr/lib/mysql
-L/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../..
-L/usr/lib/gcc-lib/i386-redhat-linux/2.96
-L/tmp/19246-i386/BUILD/pspell-.12.2/modules/.libs -L/usr/lib
-L/usr/X11R6/lib -L/home/rasmus/gd-2.0.1/ -L/usr/kerberos/lib
-L/usr/local/lib -L/usr/lib/mysql Zend/.libs/libZend.al -ldl
sapi/apache/.libs/libsapi.al main/.libs/libmain.al regex/.libs/libregex.al
/home/rasmus/php4/ext/zlib/.libs/libzlib.al
/home/rasmus/php4/ext/exif/.libs/libexif.al
/home/rasmus/php4/ext/gd/.libs/libgd.al
/home/rasmus/php4/ext/gettext/.libs/libgettext.al
/home/rasmus/php4/ext/imap/.libs/libimap.al
/home/rasmus/php4/ext/ldap/.libs/libldap.al
/home/rasmus/php4/ext/mcrypt/.libs/libmcrypt.al
/home/rasmus/php4/ext/mysql/.libs/libmysql.al
/home/rasmus/php4/ext/overload/.libs/liboverload.al
/home/rasmus/php4/ext/pcre/.libs/libpcre.al
/home/rasmus/php4/ext/pdf/.libs/libpdf.al
/home/rasmus/php4/ext/pgsql/.libs/libpgsql.al
/home/rasmus/php4/ext/posix/.libs/libposix.al
/home/rasmus/php4/ext/pspell/.libs/libpspell.al
/home/rasmus/php4/ext/session/.libs/libsession.al
/home/rasmus/php4/ext/standard/.libs/libstandard.al
/home/rasmus/php4/ext/xml/.libs/libxml.al
/home/rasmus/php4/ext/xslt/.libs/libxslt.al TSRM/.libs/libtsrm.al -lpam
-lcrypto -lssl -lc-client /usr/local/lib/libsablot.so /usr/lib/libexpat.so
/usr/lib/libpspell.so -lpq /usr/local/lib/libpdf.so -lz -lpng
/usr/lib/mysql/libmysqlclient.a -lz /usr/local/lib/libmcrypt.so
/usr/local/lib/libltdl.so -lldap -llber -lcrypt -lpam -lgd -lX11 -lXpm
-lpng -lz /usr/lib/libjpeg.so -lz -lcrypt -lresolv -lm -ldl -lnsl -lresolv
-lcrypt -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -ldl
-Wl,-soname -Wl,libphp4.so -o .libs/libphp4.so

Nasty.  I don't seem to get a gcc -shared line for the simpler flags.
Will have to investigate that, but there is something fishy here.

Building again with the same mega-flags as above but removing --with-apxs
it works again.  Now ldd shows this:

~/php4> ldd ./php
        libdl.so.2 => /lib/libdl.so.2 (0x4002b000)
        libpam.so.0 => /lib/libpam.so.0 (0x4002f000)
        libcrypto.so.2 => /lib/libcrypto.so.2 (0x40037000)
        libssl.so.2 => /lib/libssl.so.2 (0x4010d000)
        libsablot.so.0 => /usr/local/lib/libsablot.so.0 (0x4013f000)
        libexpat.so.0 => /usr/lib/libexpat.so.0 (0x401eb000)
        libpspell.so.4 => /usr/lib/libpspell.so.4 (0x40209000)
        libpspell-modules.so.1 => /usr/lib/libpspell-modules.so.1 (0x40223000)
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x40225000)
        libc.so.6 => /lib/libc.so.6 (0x40268000)
        libpq.so.2 => /usr/lib/libpq.so.2 (0x4039e000)
        libpdf.so.1 => /usr/local/lib/libpdf.so.1 (0x403ae000)
        libz.so.1 => /usr/lib/libz.so.1 (0x40439000)
        libpng.so.2 => /usr/lib/libpng.so.2 (0x40447000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x40468000)
        libmcrypt.so.4 => /usr/local/lib/libmcrypt.so.4 (0x40495000)
        libltdl.so.3 => /usr/local/lib/libltdl.so.3 (0x4049c000)
        libldap.so.2 => /usr/lib/libldap.so.2 (0x404a2000)
        liblber.so.2 => /usr/lib/liblber.so.2 (0x404cb000)
        libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x404d5000)
        libXpm.so.4 => /usr/X11R6/lib/libXpm.so.4 (0x405cb000)
        libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x405da000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x405fa000)
        libm.so.6 => /lib/libm.so.6 (0x4060c000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x4062e000)
        libgssapi_krb5.so.2 => /usr/kerberos/lib/libgssapi_krb5.so.2 (0x40645000)
        libkrb5.so.3 => /usr/kerberos/lib/libkrb5.so.3 (0x40658000)
        libk5crypto.so.3 => /usr/kerberos/lib/libk5crypto.so.3 (0x406b0000)
        libcom_err.so.3 => /usr/kerberos/lib/libcom_err.so.3 (0x406c2000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
        libsasl.so.7 => /usr/lib/libsasl.so.7 (0x406c5000)
        libssl.so.1 => /usr/lib/libssl.so.1 (0x406cf000)
        libcrypto.so.1 => /usr/lib/libcrypto.so.1 (0x406fb000)
        libgdbm.so.2 => /usr/lib/libgdbm.so.2 (0x407b7000)

So by building the command line version we are suddenly using the static
libgd.a again.  And just to make triple-sure:

~/php4> nm -o php | grep gdImageColorClosestAlpha
php:081ebf74 T gdImageColorClosestAlpha
~/php4> ./php -i | grep GD
<tr valign="baseline" bgcolor="#cccccc"><td bgcolor="#ccccff" ><b>GD
Support</b></td><td align="left">enabled</td></tr>
<tr valign="baseline" bgcolor="#cccccc"><td bgcolor="#ccccff" ><b>GD
Version</b></td><td align="left">2.0 or higher</td></tr>

We do indeed have the right GD2 libgd.a

So, somewhere between small set of flags used with apxs and the bigger
set, something is affecting it causing it to mess up which libs are being
pulled in.

-Rasmus


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to