2012-08-17 156 views
9

這是一個REPOST,之前的POST GOT已關閉,移動到服務器並再次關閉。我認爲這篇文章是一個有效的stackoverflow問題,因爲我認爲它是由一些automake/compile/linking錯誤引起的。這是一個編程問題,而不是服務器管理員問題。使用UCLIBC交叉編譯PHP

Cross compile PHP

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

開始我已經下載了PHP 5.4.0源,提取並轉移到源文件夾。

我做了配置有:

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

其次

make 

沒有錯誤,一切都正常運行。 接下來我做了一個make install。

make install 

再次,一切運行良好。 我將它移動到目標平臺和運行

/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 

我測試一個簡單的主頁與我的網絡服務器,並直接與PHP。

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

它按預期工作。 接下來我測試:

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

哦不一〜

# php shell.php 

Segmentation fault 

我teset另一個腳本:

#!/bin/php 
<?php 

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

相同的結果:

# php index.php 
helloSegmentation fault 

做我有一個PHP。 INI?

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

是的,沒有禁用的功能。 測試strace的在/ usr/ARM/WWW /斌/ 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 +++ 

的info.txt文件存在,並且它得到premission讀/寫它。

測試strace的在/ usr/ARM/WWW /斌/ 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 +++ 

,如果我通過GDB運行的index.php它給了我:

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給我這個從外殼。PHP 啓動程序:在/ usr/ARM/WWW /斌/ 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坐落在/ usr/ARM/WWW /包括/ PHP/Zend公司/ 明顯的東西時出錯交叉編譯。我錯過了什麼?我沒有找到任何配置標誌來糾正這一點,並創建一個符號鏈接到所需的位置刪除gdb輸出,但PHP仍然segfaults。

感謝您的幫助!

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

重新運行與MEMCHECK Valgrind的,有大約相同的輸出之前,但,這是新的:

php: can't resolve symbol '__libc_freeres' 

UPDATE3

雖然valgrind失敗了我,我繼續使用gdb,我在我的目標系統上創建了文件夾/home/maiden/..etc,並複製了我的php/include文件夾的內容並重新運行gdb。現在我得到這個錯誤信息:

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

這和sixeightzero昨天在評論中寫的非常相似。 我現在已經嘗試過所有PHP版本5.3.5,5.4.0,5.4.5同樣的錯誤。

UPDATE4

我下載了glibc的一個新的工具鏈,交叉編譯glibc的一個新的busybox,創造了一個chroot監牢,交叉編譯PHP用glibc,而不是uClibc中和測試它在我的chroot監牢我uClibc的盒子,它的作品!但我仍然需要讓PHP在我的uclibc環境中工作....

+0

對不起,我建議它移動,因爲我認爲它會給你更多的答案,因爲你以前的問題不會在這裏任何地方。我的壞: – Fluffeh 2012-08-17 11:06:58

+0

GAAHWAAAH !!! RAAAGE !!從恩惠6小時,現在我必須再等兩天。> _ <,一個好的沒有難過的感覺,你有一個很好的意圖,我留下了一個bugreport @ PHP.net ,讓我們看看這會帶給我什麼。^ _^ – Maidenone 2012-08-17 11:15:20

+0

@Maidenone,在光明的一面,現在是一個很好的時間來推薦更多嵌入式友好的語言,如Embedded Lua http://www.eluaproject.net/或其他http://stackoverflow.com/questions/191222/what-is-a-good-embeddable-language-i-can-use-for-scripting-inside-my-software而不是PHP,壞設計的分形... ;-) – 2012-08-17 11:18:42

回答

3

我會檢查uClibc的configure.log,看看是否ARCH_USE_MMU並啓用fork。如果不是vfork被可能由shell_exec使用的fork替換。 vfork的主要問題是,父母和孩子使用相同的內存空間,導致奇怪的崩潰。

+0

我想檢查一下。但我只得到我的CPU製造商的二進制斑點。但如果它被禁用,我會感到驚訝。我們得到了一個webkit瀏覽器,Qt和DirectFB使用相同的工具鏈。 – Maidenone 2012-08-17 13:42:58