How to install PECL PHP extension on 64bit linux while you are using 32bit XAMPP

OK, here is a problem. I wanted to play a little bit with uploadprogress PECL extension. Normally installation of PECL extension is very easy, you just do

$cd /opt/lampp
$sudo ./bin/pecl install uploadprogress

form console and PECL installer would do the rest, which was my case also - extension was downloaded from Internet and compiled successfully. After adding extension="uploadprogress.so" to php.ini and restarting XAMPP I've got next error

$ sudo ./lampp restartapache
XAMPP: Stopping Apache with SSL...
Warning: PHP Startup: Unable to load dynamic library '/opt/lampp/lib/php/extensions/no-debug-non-zts-20090626/uploadprogress.so' - /opt/lampp/lib/php/extensions/no-debug-non-zts-20090626/uploadprogress.so: wrong ELF class: ELFCLASS64 in Unknown on line 0

Running file on uploadprogress.so confirmed that system compiled 64bit version of library

$ file lib/php/extensions/no-debug-non-zts-20090626/uploadprogress.so
lib/php/extensions/no-debug-non-zts-20090626/uploadprogress.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

When you sit back and think for a moment, this is actually OK because I am running 64bit version of Kubuntu and 32bit version of XAMPP (there is no 64bit version of XAMPP for now) for my development environment, so my C compiler and linker are 64bit and will produce 64bit libraries.

Here is a solution for this situation.

First you need to add 32bit libraries for compilation, for example on ubuntu systems this would look like

$sudo apt-get install g++-multilib

Then you need to manually download PHP PECL extension that you want

$cd /opt/lampp
$wget http://pecl.php.net/get/uploadprogress-1.0.1.tgz
$tar xzf uploadprogress-1.0.1.tgz
$cd uploadprogress

Now if you have multiple PHP installed, like I do, you need to tell in console which one you want to use currently. I for example have /usr/bin/php installed from my package manager, but my main php is in my XAMPP which is on /opt/lampp/bin path. So first you need to find out which php you are currently using in console

$which php
/usr/bin/php
$PATH="/opt/lampp/bin:${PATH}"
$which php
/opt/lampp/bin/php

Now we are ready to compile and link our PHP extension

$phpize
$CFLAGS=-m32 CPPFLAGS=-m32 CCASFLAGS=-m32 ./configure
$make

This m32 flags are telling compiler to create 32bit extension.
All we have to do now is to copy our new extension to current XAMPP PHP extension directory

$cp modules/uploadprogress.so /path_to_ext_lib

And then add "extension=uploadprogress.so" to our php.ini.

That's it, we now have 32bit version of uploadprogress.so PHP extension which is compatible with our XAMPP installation.


Note: if you are getting following error when trying to restart apache or when you start php from command line

$php
Warning: PHP Startup: uploadprogress: Unable to initialize module
Module compiled with module API=20060613
PHP compiled with module API=20090626
These options need to match

That actually means that you have compiled PECL extension against wrong PHP header files - which was exactly the error I have done. I upgraded XAMPP couple of times in the past, but didn't refresh development packages. Downloading latest development package from http://www.apachefriends.org/download.php?xampp-linux-devel-1.7.4.tar.gz and updating my XAMPP installation fixed this - of course you need to recompile extension again.


Resources:
http://www.cyberciti.biz/tips/compile-32bit-application-using-gcc-64-bit...
http://davidthomasbernal.com/blog/2010/11/02/compiling-php-extensions-on...
http://www.php.net/manual/en/install.pecl.phpize.php

Read original article

Add a new comment

Comments

thanks i faced the same problem and it got solved with your steps

Solutions

for Marketers

Integrate multi-channel Digital Experience (DX) & communities with commerce experience

for Business

Use web, mobile and social to improve your products and services

for Government

Improve efficiency & lower costs with our consultancy & development

for Education

Reduce costs & engage education community while preserving legacy solutions