Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cross compiling php

I'm trying to cross compile php for arm and have good progress but I'm totally stuck where it wants to run the php itself (have no idea why). as it is an arm binary and not intel (my building platform) it won't run:

/bin/sh: /path-to-build/sapi/cli/php: cannot execute binary file

How can I fix this? The configure script understood I'm cross compiling but didn't do anything about it (from configure log):

checking whether the C compiler (/path-to-compiler/arm-none-linux-gnueabi-gcc) is a cross-compiler... yes

I'm compiling php-5.3.6 with configure command line:

export CC=/path-to-cc/arm-none-linux-gnueabi-gcc
../configure --prefix=/prefix-path/ --host=arm-none-linux-gnueabi
             --disable-libxml --disable-dom --disable-openssl
             --without-iconv --without-openssl --disable-simplexml
             --disable-xml --disable-xmlreader --disable-xmlwriter
             --without-pear --without-sqlite --without-sqlite3
             --disable-pdo --without-pdo-sqlite
like image 375
Dani Avatar asked Jul 02 '11 20:07

Dani


People also ask

What means cross compiling?

To cross-compile is to build on one platform a binary that will run on another platform. When speaking of cross-compilation, it is important to distinguish between the build platform on which the compilation is performed, and the host platform on which the resulting executable is expected to run.

Why is cross compiling so hard?

"building a cross-compiler is significantly harder than building a compiler that targets the platform it runs on." The problem exists due to the way libraries are built and accessed. In the normal situation all the libraries are located in a specific spot, and are used by all apps on that system.


4 Answers

I was able to resolve this my own by disabling phar. I hope disabling so much modules won't break something internal.

like image 159
Dani Avatar answered Oct 02 '22 00:10

Dani


Build without cross compiling and then, when cross compiling, point to the host version of php by overrididing a variable in the makefile on the command line when running make.

Something like:

make PHP_VAR_NAME=path to php built for host
like image 39
Jonas Avatar answered Oct 02 '22 01:10

Jonas


I managed to compile PHP for arm with the following parameters:

export PATH="$PATH:/toolchains/gnu_cortex-a9_tools/usr/bin" 
export ARCH=arm

configure script:

./configure --build=x86_64-unknown-linux-gnu --host=arm-linux-uclibcgnueabi --prefix=/usr/arm CC="arm-linux-uclibcgnueabi-gcc --sysroot=/toolchains/gnu_cortex-a9_tools/"  --disable-libxml --disable-dom  --without-iconv --without-openssl --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear --without-sqlite3 --disable-pdo --without-pdo-sqlite --disable-phar

followed by

make
like image 20
Maidenone Avatar answered Oct 02 '22 01:10

Maidenone


I managed to solve similar issue while cross-compiling PHP 5.6.0 by editing Makefile after running configure script. Just replace all occurrences of

$(top_builddir)/$(SAPI_CLI_PATH)

with

/usr/bin/php

Where /usr/bin/php is your host php cli. Make sure it is installed, e.g., sudo apt-get install php5-cli for Debian/Ubuntu.

After doing so phar extension builds fine

like image 27
Alex Potapenko Avatar answered Oct 02 '22 01:10

Alex Potapenko