Php – Configuring PHP on Solaris 10 64-bit

64-bitPHPsolarissolaris-10

We are currently running PHP 5.2.13 on a Solaris 10 server. I need to enable some additional features so I went to run the configure script but I'm getting some errors.

I did an 'export CFLAGS="-m64"' to make sure GCC compiled in 64-bit mode, but it looks like I don't have a 64-bit version of libiconv.so. I've tried running the script with '–without-iconv' but no dice. Here's the end of my config.log:

configure:20017: checking for strftime
configure:20471: checking whether to enable LIBXML support
configure:20519: checking libxml2 install dir
configure:20548: checking for xml2-config path
configure:20706: checking whether libxml build works
configure:20733: gcc -o conftest -m64  -D_POSIX_PTHREAD_SEMANTICS  -R/usr/ucblib -L/usr/ucblib -R/usr/local/lib/../lib/gcc/sparc-sun-solaris2.10/3.4.6 -L/usr/local/lib/../lib/gcc/sparc-sun-solaris2.10/3.4.6 -R/usr/local/lib -L/usr/local/lib conftest.c 

     -lrt -lresolv -lm -lnsl -lsocket  -lgcc -lxml2 -lz -liconv -lm -lsocket -lnsl 1>&5
ld: fatal: file /usr/local/lib/libiconv.so: wrong ELF class: ELFCLASS32
ld: fatal: File processing errors. No output written to conftest
collect2: ld returned 1 exit status
configure: failed program was:
#line 20722 "configure"
#include "confdefs.h"


    char xmlInitParser();
    int main() {
      xmlInitParser();
      return 0;
    }

Is there any way around this? I've been banging my head against this since yesterday. If it helps, here's my configure line:

./configure  --prefix=/usr/local/php --with-config-file-path=/usr/local/php/lib --with-libxml-dir=/usr/local --with-zlib=/usr/local --with-xpm-dir=/usr/local --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-apxs2=/usr/local/apache2/bin/apxs --without-pgsql --with-jpeg-dir=/usr/local/lib --with-zlib-dir=/usr/local/lib --with-gd=/usr/local --enable-mbstring --enable-exif --enable-force-cgi-redirect --enable-sockets --with-png-dir=/usr/local/lib --with-curl=/usr/local --with-ldap=/usr/local --with-openssl=/usr/local/ssl --with-gettext --with-pcre-dir=/usr/local --with-freetype-dir=/usr/local --with-mssql=/usr/local/freetds --with-readline --enable-soap

Best Answer

This has always been my biggest hassle with Solaris. Essentially if you're going to compile something, you need to make sure ALL of the following are correct:

  • CFLAGS / CXXFLAGS (for C++)
  • LDFLAGS (for the linker)
  • Possibly LD_LIBRARY_PATH

Make sure any include dirs (specified with -I) and library dirs (-R and/or -L) match the architecture you're building for. For Solaris, gcc often looks at /usr/lib, /usr/sfw/lib etc first, but if you want 64-bit then you need to compile against /usr/lib/64, /usr/sfw/lib/64, etc - specifying gcc -m64 isn't enough for it to do this.

You can verify the ISA of the existing iconv library using ldd and file. If you compiled libiconv yourself, you'll need to recompile it, otherwise find another binary source or... recompile it :-)