2012-08-17 36 views
9

ĐÂY LÀ BÀI ĐĂNG TRỞ LẠI, TRƯỚC ĐÔI ĐÃ ĐƯỢC ĐÓNG GÓI, CHUYỂN ĐẾN MÁY CHỦ ĐĂNG KÝ VÀ ĐÓNG CỬA. Tôi nghĩ rằng bài đăng này là một vấn đề stackoverflow hợp lệ vì tôi nghĩ rằng nó gây ra bởi một số lỗi automake/biên dịch/liên kết. Đây là một vấn đề lập trình không phải là vấn đề quản trị máy chủ.Cross biên dịch PHP với UCLIBC

Cross compile PHP

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

Bắt đầu bài

Tôi đã tải nguồn PHP 5.4.0, chiết xuất nó và di chuyển vào thư mục nguồn.

tôi làm một cấu hình với:

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

Tiếp theo là

make 

không có lỗi, tất cả mọi thứ chạy tốt. Tiếp theo, tôi thực hiện cài đặt.

make install 

Một lần nữa mọi thứ đều ổn. tôi di chuyển nó đến nền tảng mục tiêu và chạy

/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 

tôi thử nghiệm một trang chủ đơn giản với máy chủ web của tôi và trực tiếp với php.

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

hoạt động như mong đợi. tới tôi thử nghiệm:

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

oh Choáng ~

# php shell.php 

Segmentation fault 

tôi teset một kịch bản khác:

#!/bin/php 
<?php 

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

Cùng một kết quả:

# php index.php 
helloSegmentation fault 

làm tôi có một php. ini?

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

có và không có chức năng bị vô hiệu hóa. thử nghiệm strace/usr/tay/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 +++ 

file info.txt tồn tại và nó đã premission để đọc/ghi vào nó.

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

nếu tôi chạy index.php qua gdb nó mang lại cho tôi:

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 mang lại cho tôi này từ vỏ.php Bắt đầu chương trình:/usr/tay/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 nằm trong/usr/tay/www/include/php/Zend/ rõ ràng là một cái gì đó đã đi sai trong biên dịch chéo. tôi đã bỏ lỡ những gì? tôi không tìm thấy bất kỳ cờ cấu hình nào để sửa lỗi này và tạo một liên kết tượng trưng đến vị trí mong muốn, loại bỏ đầu ra gdb nhưng php vẫn còn bị ngắt.

Cảm ơn bạn đã trợ giúp!

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

tái chạy valgrind với memcheck, đã về cùng một sản lượng như trước nhưng đây là mới:

php: can't resolve symbol '__libc_freeres' 

UPDATE3

Trong khi valgrind thất bại, tôi tiếp tục với gdb, tôi đã tạo thư mục /home/maiden/..etc trên hệ thống đích và sao chép nội dung của thư mục php/include và gdb chạy lại. bây giờ tôi nhận được thông báo lỗi này:

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

điều này rất giống với những gì sixeightzero đã viết trong các nhận xét hôm qua. Tôi hiện đã thử phiên bản PHP 5.3.5, 5.4.0, 5.4.5 cùng một lỗi trên tất cả.

Update4

Tôi đã tải về một toolchain mới cho glibc, chéo biên soạn một busybox mới với glibc, tạo ra một chroot tù, xuyên biên soạn php với glibc thay vì uclibc và thử nghiệm nó bên trong tù chroot của tôi trên uclibc của tôi và nó hoạt động! Nhưng tôi vẫn cần php để làm việc trong môi trường uclibc của tôi ....

+0

Xin lỗi bạn đời, tôi đề nghị bạn nên di chuyển như tôi nghĩ nó sẽ giúp bạn nhận được nhiều câu trả lời hơn vì câu hỏi trước của bạn không đi đâu cả. My bad: ( – Fluffeh

+0

GAAHWAAAH !!! RAAAGE !! là 6h từ tiền thưởng, bây giờ tôi phải đợi thêm 2 ngày nữa.> _ <, Cũng không có cảm xúc khó, bạn có ý định tốt. Tôi đã để lại một bugreport @ PHP.net , cho phép xem nơi đó sẽ đưa tôi đi.^_^ – Maidenone

+0

@Maidenone, về mặt tươi sáng, giờ là thời điểm tuyệt vời để đề xuất ngôn ngữ thân thiện hơn, như Embedded Lua http://www.eluaproject.net/ hoặc một số ngôn ngữ khác http://stackoverflow.com/questions/191222/what-is-a-good-embeddable-language-i-can-use-for-scripting-inside-my-software thay vì PHP, Fractal of Bad Design ... ;-) –

Trả lời

3

tôi sẽ kiểm tra cấu hình.log của uClibc để xem ARCH_USE_MMU và ngã ba được bật hay chưa. nếu không vfork được thay thế bằng ngã ba có khả năng được sử dụng bởi shell_exec. vấn đề chính với vfork là, cha mẹ và trẻ em sử dụng cùng một không gian bộ nhớ dẫn đến tai nạn kỳ lạ.

+0

Tôi cũng muốn kiểm tra điều đó. nhưng tôi chỉ có các đốm màu nhị phân từ nhà sản xuất CPU của tôi. Nhưng tôi sẽ ngạc nhiên nếu nó bị vô hiệu hóa. Chúng tôi đã có một trình duyệt webkit, Qt và DirectFB hoạt động với cùng một chuỗi công cụ. – Maidenone

Các vấn đề liên quan