PHP 版本

简要说明

PHP 版本依赖于如下几个库:

对于 Linux 系统,我们要求使用 g++ 4.9 或者更高版本进行编译,并静态链接 libstdc++,否则可能在其他机器出现兼容性问题。当然,为了保证最大兼容性,我们建议你使用和生产环境相同的环境进行编译。

下面,我们以 CentOS 6 为例,讲解如何编译 OpenRASP PHP 扩展。值得注意的是,CentOS 7 的安装方法、要执行的命令完全一样。

首先,我们来准备编译环境

使用如下命令,安装 devtools-3 (g++ 4.9.2) 以及 xxd 命令

  1. yum install -y centos-release-scl vim-common libuuid-devel
  2. yum install -y devtoolset-3-gcc-c++

如果你使用的是发行版自带的 PHP 软件,你还需要安装对应的头文件

  1. yum install -y php-devel

安装完成后,执行如下命令进入编译环境

  1. scl enable devtoolset-3 bash

P.S 如果你想在自动编译脚本里使用 devtoolset-3,你需要改用 source /opt/rh/devtoolset-3/enable 命令

然后,我们来编译 Google V8。由于在 CentOS 6 上无法编译 Google V8,所以我们提供了编译好的 libv8-5.9-linux.tar.gz,可直接下载使用。

我们将这个压缩包解压到 /tmp

  1. wget https://packages.baidu.com/app/openrasp/libv8-5.9-linux.tar.gz -P /tmp
  2. tar -xvf /tmp/libv8-5.9-linux.tar.gz -C /tmp

最后,我们来编译 OpenRASP PHP 扩展

进入源代码目录,执行下面的命令即可;如果你的 PHP 是自己编译的,请使用对应路径的 phpize 命令。

  1. # 如果之前编译过,清理下临时文件
  2. phpize --clean
  3. # 生成 configure 文件
  4. phpize
  5. # 编译
  6. ./configure --with-v8=/tmp/libv8-5.9-linux --with-gettext -q
  7. make

如果中间没有出错,可以执行 make install 安装;也可以将生成的扩展 aka modules/openrasp.so 复制到其它机器安装。对于扩展的具体安装方法,请参考 PHP 服务器安装

Mac 系统

虽然 homebrew 里提供了 Google V8 5.1.281.47 版本,由于这个版本太老,所以同 Linux 系统一样,我们提供了编译好的类库 libv8-5.9-macos.tar.gz。这个库适用于 MacOS 10.X,可直接下载使用。

其余安装步骤同 Linux 系统

Windows 系统

由于 PHP <= 5.4 只能使用 Visual Studio 2008 以及更低版本编译,而 Google V8 5.X 要求 Visual Studio 2015。所以,对于 Windows 系统我们目前只支持 5.5、5.6 两个版本。

首先,我们来准备编译环境

你需要下载 VS 2015,对应版本的 PHP SDK,以及 Google V8 开发库。为了方便大家二次开发,我们直接在官方 SDK的基础上,增加了 libv8,所以你只需要下载我们提供的 SDK 即可。

打开 CMD

  1. # 设置 VS 2015 编译环境 - 将 x86 替换为 x64,即可编译 64 位版本
  2. %VS140COMNTOOLS%..\..\vc\vcvarsall.bat x86
  3. # 设置 php sdk 依赖环境
  4. <php-sdk>\bin\phpsdk_setvars.bat
  5. # 进入 php 源代码目录
  6. cd <php-sdk>\vc11\php-5.6.33-src
  7. # 如果编译过
  8. nmake clean
  9. # 生成 configure.js 脚本
  10. buildconf.bat
  11. # 禁用所有模块,只开启 openrasp
  12. configure.bat --disable-all --enable-cli --enable-json --enable-openrasp
  13. # 编译
  14. nmake php_openrasp.dll

最终生成的DLL在 Release_TS 目录下面,64 位版本在 x64\Release_TS 目录下面

编译 php 5.5 版本

<php-sdk>\vc11\php-5.6.33-src\Zend\zend_modules.h 第 36 行 ZEND_MODULE_API_NO 的值改为 20121212,然后按前述步骤编译即可

常见问题

1. static libc++ library "libstdc++.a" unavailable 警告

当编译环境缺少 C++ 静态链接库时,即 libstdc++.a,我们会在 configure 脚本里打印这个警告:

  1. # ./configure --with-v8=/tmp/libv8 -q
  2. configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
  3. Warning: static libc++ library "libstdc++.a" unavailable, porting to other system may fail!

如果不能静态链接 C++ 函数库,将编译好的扩展安装到生产环境时可能会出现找不到 libstdc++.so 这样的错误。当然,如果你的编译环境和生产环境完全相同,可以忽略这个错误。

原文: https://rasp.baidu.com/doc/hacking/compile/php.html