首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用UCLIBC交叉编译PHP

用UCLIBC交叉编译PHP
EN

Stack Overflow用户
提问于 2012-08-17 11:04:16
回答 1查看 1.7K关注 0票数 9

--这是一个转发,前一篇文章被关闭,移动到SERVERFAULT,然后再次关闭。--我认为这个帖子是一个有效的堆栈溢出问题,因为我认为它是由一些自动/编译/链接错误引起的。这是一个编程问题,而不是服务器管理问题。

Cross compile PHP

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

开始后

我已经下载了PHP5.4.0源代码,并将其解压缩到源代码文件夹中。

我使用以下方法进行配置:

代码语言:javascript
复制
./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/

紧接着是

代码语言:javascript
复制
make

没有错误,一切都很好。接下来,我做一个。

代码语言:javascript
复制
make install

再说一遍一切都很好。我把它移到目标平台并运行

代码语言:javascript
复制
/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测试一个简单的主页。

代码语言:javascript
复制
<?php echo "hello" ?>
# php index.php
hello

它如预期的那样工作。接下来我测试:

代码语言:javascript
复制
<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>

哦不~

代码语言:javascript
复制
# php shell.php 

Segmentation fault

我讲了另一个剧本:

代码语言:javascript
复制
#!/bin/php
<?php

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

同样的结果:

代码语言:javascript
复制
# php index.php 
helloSegmentation fault

我有php.ini吗?

代码语言:javascript
复制
# /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

代码语言:javascript
复制
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

代码语言:javascript
复制
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,它会给出:

代码语言:javascript
复制
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给我的。

代码语言:javascript
复制
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

H位于/usr/arm/www/include/php/Zend/显然在交叉编译过程中出错了。我错过了什么?我没有找到任何配置标志来纠正这一点,并且创建一个指向所需位置的符号链接可以删除gdb输出,但是php仍然是分段错误。

谢谢你的帮助!

更新:

代码语言:javascript
复制
# 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重新运行val差制,得到了与以前大致相同的输出,但这是新的:

代码语言:javascript
复制
php: can't resolve symbol '__libc_freeres'

Update3

我继续使用gdb,在目标系统上创建了文件夹/home/maiden/.等等,并复制了php/include文件夹的内容并重新运行gdb。现在我收到一条错误消息:

代码语言:javascript
复制
(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;

这与2008年的评论中所写的非常相似。我现在已经尝试了PHPVersion5.3.5、5.4.0、5.4.5等相同的错误。

Update4

我下载了一个用于glibc的新工具链,用glibc编译了一个新的busybox,创建了chroot监狱,用glibc而不是uclibc交叉编译了php,并在我的uclibc盒上的chroot监狱中测试了它,它工作了!但是我仍然需要让php在我的uclibc环境中工作..。

EN

回答 1

Stack Overflow用户

发布于 2012-08-17 13:06:29

我将检查configure.log of uClibc以查看是否启用了、ARCH_USE_MMU、和fork。如果不使用,则用shell_exec可能使用的fork替换vfork。vfork的主要问题是,父级和子级使用相同的内存空间,这会导致奇怪的崩溃。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12004567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档