2012-08-17 13 views
9

QUESTO È UN REPOST, IL POST PRECEDENTE È CHIUSO, TRASFORMATO A SERVERFAULT E CHIUSO DI NUOVO. Penso che questo post sia un problema di stackoverflow valido perché penso sia causato da qualche errore di automake/compile/linking. Questo è un problema di programmazione e non un problema di amministrazione del server.Compilare in PHP PHP con UCLIBC

Cross compile PHP

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

Inizio post

Ho scaricato il sorgente PHP 5.4.0, estratto e spostato nella cartella di origine.

devo fare una configurazione 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/ 

Seguito da

make 

nessun errore, tutto funziona bene. Quindi eseguo l'installazione.

make install 

Ancora tutto funziona correttamente. mi muovo alla piattaforma di destinazione ed eseguire

/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 

ho testare un semplice home page con il mio webserver e direttamente con php.

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

funziona come previsto. prossimo test i:

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

oh noes ~

# php shell.php 

Segmentation fault 

ho teset un altro script:

#!/bin/php 
<?php 

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

Stesso risultato:

# php index.php 
helloSegmentation fault 

ho un php. ini?

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

sì, e nessuna funzione disabilitata. test strace/usr/braccio/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 +++ 

il file info.txt esiste e ha ottenuto premission di lettura/scrittura.

Testing strace/usr/braccio/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 +++ 

se corro l'index.php attraverso gdb mi dà:

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 me questo dà dalla shell.php Avvio del programma:/usr/braccio/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 si trova in/usr/braccio/www/include/php/Zend/ ovviamente qualcosa è andato storto durante compilazione incrociata. cosa ho perso? non trovo alcun flag di configurazione per correggere questo e creare un link simbolico alla posizione desiderata rimuove l'output gdb ma php still segfaults.

Grazie per qualsiasi aiuto!

UPDATE:

# 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

re-run valgrind con memcheck, ha circa lo stesso output come prima, ma questo era nuovo:

php: can't resolve symbol '__libc_freeres' 

Update3

Mentre valgrind mi ha deluso, ho continuato con gdb, ho creato la cartella /home/maiden/..etc sul mio sistema di destinazione e copiato il contenuto della mia cartella php/include e rieseguo gdb. ora ottengo questo messaggio di errore:

(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; 

questo è molto simile a ciò che sixeightzero ha scritto nei commenti ieri. Ora ho provato a PHP la versione 5.3.5, 5.4.0, 5.4.5 stesso errore su tutti.

Update4

Ho scaricato un nuovo toolchain per glibc, croce ha compilato un nuovo busybox con glibc, ha creato un chroot jail, croce compilato PHP con glibc invece di uclibc e testato all'interno del mio chroot jail sul mio uclibc scatola, e funziona! Ma ho ancora bisogno di far funzionare php nel mio ambiente uclibc ....

+0

Scusami amico, ho suggerito di essere spostato perché pensavo che avrebbe ottenuto più risposte come la tua domanda precedente non stava andando da nessuna parte qui. Il mio cattivo :( – Fluffeh

+0

GAAHWAAAH !!! RAAAGE !! era 6h da taglie, ora devo aspettare altri 2 giorni.> _ <, Un pozzo senza sentimenti, hai avuto un buon intento. Ho lasciato un bugreport @ PHP.net , vediamo dove mi porterà.^_^ – Maidenone

+0

@Maidenone, sul lato positivo, ora è un momento eccellente per suggerire un linguaggio più integrato, come Embedded Lua http://www.eluaproject.net/ o qualche altro http://stackoverflow.com/questions/191222/what-is-a-good-embeddable-language-i-can-use-for-scripting-inside-my-software anziché PHP, Fractal of Bad Design ... ;-) –

risposta

3

vorrei controllare configure.log di uClibc per vedere se ARCH_USE_MMU e la forcella è abilitata. se non vfork viene sostituito con fork che è probabilmente usato da shell_exec. il problema principale con vfork è che genitore e figlio usano lo stesso spazio di memoria che porta a strani arresti anomali.

+0

Vorrei controllare anche quello. ma ho ottenuto solo blob binari dal mio produttore di CPU. Ma sarei sorpreso se fosse disabilitato. Abbiamo un browser webkit, Qt e DirectFB con la stessa toolchain. – Maidenone