これは再投稿です。前の投稿は閉じられ、SERVERFAULT に移動され、再び閉じられました。この投稿は有効なスタックオーバーフローの問題だと思います。なぜなら、automake/compile/linking エラーが原因だと思うからです。これは、サーバー管理の問題ではなく、プログラミングの問題です。
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
Web サーバーと直接 php で簡単なホームページをテストします。
<?php echo "hello" ?>
# php index.php
hello
期待どおりに動作します。次にテストします。
<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>
いやいや〜
# php shell.php
Segmentation fault
別のスクリプトをテストします。
#!/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/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 +++
ファイル info.txt が存在し、読み取り/書き込みの許可を得ています。
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 +++
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 は shell.php からこれを提供します プログラムの開始: /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 は /usr/arm/www/include/php/Zend/ にあります。明らかに、クロス コンパイル中に問題が発生しました。私は何を逃したのですか?これを修正するためのconfigureフラグが見つからず、目的の場所へのシンボリックリンクを作成するとgdb出力が削除されますが、phpはまだsegfaultsします。
助けてくれてありがとう!
アップデート:
# 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のすべてで同じエラーを試しました。
アップデート4
glibc 用の新しいツールチェーンをダウンロードし、新しい busybox を glibc でクロスコンパイルし、chroot ジェイルを作成し、php を uclibc の代わりに glibc でクロスコンパイルし、自分の uclibc ボックスの chroot ジェイル内でテストしました。しかし、私はまだphpを私のulibc環境で動作させる必要があります....