ĐÂ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
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 ....
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
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
@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 ... ;-) –