2012-08-17 24 views
9

ESTE ES UN REPOST, EL CORREO ANTERIOR SE CERRÓ, SE MUDÓ A SERVERFAULT Y SE CERRÓ OTRA VEZ. Creo que esta publicación es un problema de stackoverflow válido porque creo que es causada por algún error de automake/compile/linking. Este es un problema de programación, no un problema de administrador del servidor.Compilación cruzada PHP con UCLIBC

Cross compile PHP

https://serverfault.com/questions/418521/cross-compile-php

inicio de la post

He descargado el código fuente de PHP 5.4.0, se extrae y se instaló en la carpeta de origen.

hago una configure con:

./configure --build=x86_64-unknown-linux-gnu --host=arm-linux-uclibcgnueabi --prefix=/usr/arm/www 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 --with-config-file-path=/etc/ 

Seguido por

make 

no hay errores, todo funciona bien. Luego hago una instalación make.

make install 

De nuevo, todo funciona bien. lo muevo a la plataforma de destino y ejecutar

/usr/arm/www/bin/php -v 
PHP 5.4.0 (cli) (built: Aug 15 2012 16:07:41) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies 

pruebo una página sencilla casa con mi servidor web y directamente con php.

<?php echo "hello" ?> 
# php index.php 
hello 

funciona como se esperaba. siguiente prueba i:

<?php 
$output = shell_exec('ls -lart'); 
echo "<pre>$output</pre>"; 
?> 

oh no ~

# php shell.php 

Segmentation fault 

I teset otro guión:

#!/bin/php 
<?php 

echo "hello"; 
$handle = fopen("info.txt", "r"); 
echo $handle; 
?> 

mismo resultado:

# php index.php 
helloSegmentation fault 

qué tengo un php. ini?

# /usr/arm/www/bin/php --ini 
Configuration File (php.ini) Path: /etc/ 
Loaded Configuration File:   /etc/php.ini 

sí, y no hay funciones deshabilitadas. existe prueba strace/usr/brazo/www/bin/php index.php

lstat("/srv/www/info.txt", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0 
open("/srv/www/info.txt", O_RDONLY)  = 3 
fstat(3, {st_mode=S_IFREG|0644, st_size=20, ...}) = 0 
lseek(3, 10, SEEK_CUR)     = 0 
--- SIGSEGV (Segmentation fault) @ 0 (0) --- 
+++ killed by SIGSEGV +++ 

el archivo info.txt y se puso premission para leer/escribir en él.

strace Exámenes/usr/brazo/www/bin/php shell.php

fcntl64(3, F_GETFL)      = 0 (flags O_RDONLY) 
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7e31fddc) = -1 EINVAL (Invalid argument) 
vfork()         = 3324 
close(4)        = 0 
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 
read(3, "total 24\n-rw-rw-r-- 1 1001 "..., 8192) = 468 
read(3, ""..., 8192)     = 0 
--- SIGCHLD (Child exited) @ 0 (0) --- 
close(3)        = 0 
wait4(3324, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 3324 
--- SIGSEGV (Segmentation fault) @ 0 (0) --- 
+++ killed by SIGSEGV +++ 

si corro el index.php través de GDB me da:

Starting program: /usr/arm/www/bin/php index.php 
hello 
Program received signal SIGSEGV, Segmentation fault. 
zend_do_fcall_common_helper_SPEC (execute_data=0x2ac7a040) at /home/maiden/Downloads/php-5.4.0/Zend/zend.h:391 
391 /home/maiden/Downloads/php-5.4.0/Zend/zend.h: No such file or directory. 
    in /home/maiden/Downloads/php-5.4.0/Zend/zend.h 

GDB mí esto da de la cáscara.php al iniciar el programa:/usr/brazo/www/bin/php shell.php

Program received signal SIGSEGV, Segmentation fault. 

zend_do_fcall_common_helper_SPEC (execute_data=0x2ab76040) at /home/maiden/Downloads/php-5.4.0/Zend/zend.h:391 
391 in /home/maiden/Downloads/php-5.4.0/Zend/zend.h 

zend.h se encuentra en/usr/brazo/www/include/PHP/Zend/ , obviamente, algo salió mal durante compilación cruzada. ¿Qué me he perdido? no encuentro ninguna bandera de configuración para corregir esto y al crear un enlace simbólico a la ubicación deseada se elimina la salida de gdb pero php todavía segfaults.

¡Gracias por cualquier ayuda!

ACTUALIZACIÓN:

# valgrind php test.php 
==2181== Memcheck, a memory error detector 
==2181== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. 
==2181== Using Valgrind-3.8.0 and LibVEX; rerun with -h for copyright info 
==2181== Command: php test.php 
==2181== 
==2181== Conditional jump or move depends on uninitialised value(s) 
==2181== at 0x4004EC8: ??? (in /lib/ld-uClibc-0.9.30-nptl.so) 
==2181== 
==2181== Invalid read of size 4 
==2181== at 0x4004D48: _dl_get_ready_to_run (in /lib/ld-uClibc-0.9.30-nptl.so) 
==2181== Address 0x7d4cc304 is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes 
==2181== 
==2181== Invalid read of size 4 
==2181== at 0x48C348C: __uClibc_main (in /lib/libuClibc-0.9.30-nptl.so) 
==2181== Address 0x7d4cc554 is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes 
==2181== 
==2181== Invalid write of size 4 
==2181== at 0x233010: __eqdf2 (ieee754-df.S:1120) 
==2181== Address 0x7d4cb0bc is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes 
==2181== 
Warning: shell_exec(): Unable to execute 'ls -lart' in /test.php on line 3 
==2181== Invalid read of size 4 
==2181== at 0x1FF1AC: zend_do_fcall_common_helper_SPEC (zend.h:391) 
==2181== by 0x1F3D17: execute (zend_vm_execute.h:410) 
==2181== by 0x18B217: zend_execute_scripts (zend.c:1279) 
==2181== by 0x1365BB: php_execute_script (main.c:2473) 
==2181== by 0x22B52B: do_cli (php_cli.c:988) 
==2181== by 0x22BD4B: main (php_cli.c:1364) 
==2181== Address 0x8 is not stack'd, malloc'd or (recently) free'd 
==2181== 
Segmentation fault 

Update2

repetición valgrind con memcheck, puso sobre el mismo resultado que antes, pero esto era nuevo:

php: can't resolve symbol '__libc_freeres' 

Update3

Mientras valgrind me ha fallado, continué con gdb, creé la carpeta /home/maiden/..etc en mi sistema de destino y copié el contenido de mi carpeta php/include y volví a ejecutar gdb. ahora recibo este mensaje de error:

(gdb) run index.php 
Starting program: /bin/php index.php 
hello 
Program received signal SIGSEGV, Segmentation fault. 
zend_do_fcall_common_helper_SPEC (execute_data=0x2ab34040) at /home/maiden/Downloads/php-5.4.5/Zend/zend.h:391 
warning: Source file is more recent than executable. 
391  return --pz->refcount__gc; 

esto es muy similar a lo que sixeightzero escribió en los comentarios de ayer. Ahora he intentado PHP versión 5.3.5, 5.4.0, 5.4.5 mismo error en todos.

Update4

he descargado un nuevo conjunto de herramientas para la glibc, cruz compiló una nueva busybox con glibc, crea una jaula chroot, cruz compilado PHP con glibc en lugar de uClibc y probado dentro de mi jaula chroot en mi uClibc caja, y funciona! Pero todavía tengo que conseguir php para trabajar en mi entorno uclibc ...

+0

Lo siento, compañero, sugerí que se moviera porque pensé que obtendría más respuestas ya que su pregunta anterior no iba a ir a ninguna parte aquí. Mi mal :( – Fluffeh

+0

GAAHWAAAH !!! RAAAGE !! fue 6 horas de recompensa, ahora tengo que esperar 2 días más.> _ <, Un bien sin resentimientos, tenías un buen intento. Dejé un bugreport @ PHP.net , veamos a dónde me llevará eso.^_^ – Maidenone

+0

@Maidenone, por el lado bueno, ahora es un momento excelente para sugerir un lenguaje amigable más incrustado, como Embedded Lua http://www.eluaproject.net/ o algún otro http://stackoverflow.com/questions/191222/what-is-a-good-embeddable-language-i-can-use-for-scripting-inside-my-software en lugar de PHP, Fractal of Bad Design ... ;-) –

Respuesta

3

me gustaría comprobar configure.log de uClibc para ver si ARCH_USE_MMU y tenedor está habilitado. si no, vfork se reemplaza con fork, que es probable que use shell_exec. El principal problema con vfork es que el padre y el hijo usan el mismo espacio de memoria, lo que genera bloqueos extraños.

+0

También me gustaría comprobarlo. pero solo obtuve blobs binarios del fabricante de mi CPU. Pero me sorprendería si estuviera deshabilitado. Tenemos un navegador webkit, Qt y DirectFB con la misma cadena de herramientas. – Maidenone

Cuestiones relacionadas