2012-08-17 20 views
9

TO JEST POWTARZANY, POPRZEDNI POST GOT ZAMKNIĘTY, PRZENIESIONY DO SERWERKI I ZAMKNIĘTY PONOWNIE. Myślę, że ten post jest ważnym problemem stackoverflow, ponieważ myślę, że to spowodowane przez jakiś błąd automake/kompilacji/linkowania. To jest problem programistyczny, a nie problem administratora serwera.Krzyża kompilacja PHP z UCLIBC

Cross compile PHP

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

Początek postu

Pobrałem źródła PHP 5.4.0, ekstrahowano go i przeniósł się do folderu źródłowego.

robię configure z:

./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/ 

Obserwowani przez

make 

żadnych błędów, wszystko działa poprawnie. Dalej robię make install.

make install 

Znowu wszystko działa dobrze. i przenieść go do platformy docelowej i uruchom

/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 

przetestować prostą stronę domu z mojego serwera WWW i bezpośrednio z php.

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

działa zgodnie z oczekiwaniami. Kolejny test i:

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

oh NoEs ~

# php shell.php 

Segmentation fault 

I teset inny scenariusz:

#!/bin/php 
<?php 

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

sam wynik:

# php index.php 
helloSegmentation fault 

mam php. ini?

tak, i bez wyłączonych funkcji. testowanie strace/usr/arm/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 +++ 

plik info.txt istnieje i zrobiło premission na zapis/odczyt do niego.

Testowanie strace/usr/arm/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 +++ 

jeśli uruchomię index.php przez gdb daje mi:

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 daje mi to z powłoki.php Uruchamianie programu:/usr/arm/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 znajduje się w katalogu/usr/arm/www/include/PHP/Zend/ oczywiście coś poszło nie tak podczas kompilacja krzyżowa. co przeoczyłem? nie znajduję żadnej flagi configure, aby to poprawić, a utworzenie dowiązania symbolicznego do żądanej lokalizacji powoduje usunięcie wyjścia gdb, ale php nadal segfaults.

Dzięki za pomoc!

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 z memcheck, dostał o tej samej mocy jak wcześniej, ale to było nowe:

php: can't resolve symbol '__libc_freeres' 

Update3

Chociaż valgrind mnie zawiódł, kontynuowałem z gdb, utworzyłem folder /home/maiden/..etc w moim systemie docelowym i skopiowałem zawartość folderu php/include i ponownie uruchomiłem gdb. teraz dostaję ten komunikat o błędzie:

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

jest to bardzo podobne do tego, co sixeightzero napisał w komentarzach wczoraj. Próbowałem już teraz wersji PHP 5.3.5, 5.4.0, 5.4.5 na wszystkich.

Update4

Pobrałem nowy toolchain dla glibc, krzyż przygotował nową busybox z glibc, stworzył chroot więzienia, cross skompilowany php z glibc zamiast uClibc i testowano je w moim chroot więzienia na moim uClibc pudełko, i działa! Ale nadal muszę uzyskać php do pracy w moim środowisku Uclibc ....

+0

Przykro mi, kolego, zasugerowałem, że mam zostać przeniesiony, ponieważ myślałem, że dostaniesz więcej odpowiedzi, ponieważ twoje poprzednie pytanie nigdzie się nie wybierało. Mój zły :( – Fluffeh

+0

GAAHWAAAH !!! RAAAGE !! było 6 h od bounty, teraz muszę poczekać jeszcze 2 dni.> _ <, Dobrze nie ma żadnych ostrych uczuć, miałeś dobre intencje. Zostawiłem zgłoszenie błędu @ PHP.net , zobaczmy, gdzie to mnie zaprowadzi.^_^ – Maidenone

+0

@Maidenone, z jasnej strony, teraz jest doskonała okazja, aby zaproponować bardziej przyjazny język, np. Embedded Lua http://www.eluaproject.net/ lub inny http://stackoverflow.com/questions/191222/what-is-a-good-embeddable-language-i-can-use- for-scripting-inside-my-software zamiast PHP, Fractal of Bad Design ... ;-) –

Odpowiedz

3

Sprawdziłbym configure.log uClibc, aby sprawdzić, czy ARCH_USE_MMU i widelec jest włączony. jeśli nie vfork jest zamieniany na fork, który prawdopodobnie będzie używany przez shell_exec. główny problem z vfork polega na tym, że rodzic i dziecko używają tej samej przestrzeni pamięci, co prowadzi do dziwnych awarii.

+0

Chciałbym to sprawdzić. ale mam tylko binarne bloki od mojego producenta CPU. Ale byłbym zaskoczony, gdyby był wyłączony. Mamy przeglądarkę webkitów, Qt i DirectFB z tym samym toolchainem. – Maidenone