真正解决aarch64 Debian 编译安装PHP5.x 报错(此解决方案ARM架构下所有环境全部适用)

真正解决aarch64 Debian 编译安装PHP5.x 报错(此解决方案ARM架构下所有环境全部适用)

测试出错环境:

1、Oracle ARM Debian 11

2、宝塔面板7.9.8

起因:因为测试需要不得不使用PHP5.6,正好手上有一台ARM架构的服务器,原来安装PHP7以上环境一切正常,唯独安装php5.x版本时会出现错误:

/tmp/cczzFizq.s: Assembler messages:
/tmp/cczzFizq.s:6684: Error: operand 2 must be an integer register -- mul x2,v0,v1'
/tmp/cczzFizq.s:6685: Error: operand 2 must be an integer register -- smulh x0,v0,v1'
/tmp/cczzFizq.s:7403: Error: operand 2 must be an integer register -- mul x2,v9,v0'
/tmp/cczzFizq.s:7404: Error: operand 2 must be an integer register -- smulh x1,v9,v0'
/tmp/cczzFizq.s:7553: Error: operand 2 must be an integer register -- mul x2,v0,v0'
/tmp/cczzFizq.s:7554: Error: operand 2 must be an integer register -- smulh x1,v0,v0'
make: *** [Makefile:1989: Zend/zend_operators.lo] Error 1

故障原因:经过大量搜索,终于在官方找到解决办法。这个问题主要是ARM机器在编译时不能“取整”导致的,网上很多教程要不就是换PHP7以版本,要不是就是更换系统。这个是PHP的一个BUG,官方已经修复,不过只支持PHP7以上版本。

解决方法:

修改PHP安装包Zend/zend_multiply.h第65、66行左右(“+”为修改后内容),PHP5.x 版本通用。

 	__asm__("mul %0, %2, %3\n"								\
 		"smulh %1, %2, %3\n"								\
 		"sub %1, %1, %0, asr #63\n"							\
-			: "=X"(__tmpvar), "=X"(usedval)						\
-			: "X"(a), "X"(b));							\
+			: "=&r"(__tmpvar), "=&r"(usedval)					\
+			: "r"(a), "r"(b));							\
 	if (usedval) (dval) = (double) (a) * (double) (b);					\
 	else (lval) = __tmpvar;									\
 } while (0)

修改完之后就可以正常编译了。

宝塔面板修改:

php包安装路径/www/server/php/56/src,已经解压出了来,直接修改保存就可以了。

因为宝塔编译安装要点时间,所以在一开始安装就修改,不要等到安装失败再修改。

请注意(非常重要):

您需要回复本文后才能查看完整内容

立即回复
已经回复?立即刷新

其它面板或一键环境包自行修改。

有任何解决过程遇到的问题,可评论本文,我会在看到评论后回复。

BUG原文:https://bugs.php.net/patch-display.php?bug_id=70015&patch=fix-asm-constraints-in-aarch64-multiply-macro&revision=latest

原创文章,作者:中国IPv6网,如若转载,请注明出处:https://www.ipv6s.com/basis/application/202308073692.html

(0)
中国IPv6网的头像中国IPv6网
上一篇 2023年8月4日 下午6:57
下一篇 2023年8月9日 下午5:47

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

评论列表(2条)

  • Bero
    Bero 2024年7月4日 下午1:32

    试试看行不行

  • 笑笑
    笑笑 2024年8月4日 下午8:14

    试试看行不行