- PHP 版本
- 简要说明
- Linux 系统
- Mac 系统
- Windows 系统
- 常见问题
- 1. static libc++ library "libstdc++.a" unavailable 警告
- 1. static libc++ library "libstdc++.a" unavailable 警告
PHP 版本
简要说明
PHP 版本依赖于如下几个库:
- Google V8 - 5.9
- fswatch - 1.11.2 (已经集成源代码,无需下载)
Linux 系统
对于 Linux 系统,我们要求使用 g++ 4.9 或者更高版本进行编译,并静态链接 libstdc++,否则可能在其他机器出现兼容性问题。当然,为了保证最大兼容性,我们建议你使用和生产环境相同的环境进行编译。
下面,我们以 CentOS 6 为例,讲解如何编译 OpenRASP PHP 扩展。值得注意的是,CentOS 7 的安装方法、要执行的命令完全一样。
首先,我们来准备编译环境
使用如下命令,安装 devtools-3 (g++ 4.9.2) 以及 xxd 命令
yum install -y centos-release-scl vim-common libuuid-develyum install -y devtoolset-3-gcc-c++
如果你使用的是发行版自带的 PHP 软件,你还需要安装对应的头文件
yum install -y php-devel
安装完成后,执行如下命令进入编译环境
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,
wget https://packages.baidu.com/app/openrasp/libv8-5.9-linux.tar.gz -P /tmptar -xvf /tmp/libv8-5.9-linux.tar.gz -C /tmp
最后,我们来编译 OpenRASP PHP 扩展
进入源代码目录,执行下面的命令即可;如果你的 PHP 是自己编译的,请使用对应路径的 phpize 命令。
# 如果之前编译过,清理下临时文件phpize --clean# 生成 configure 文件phpize# 编译./configure --with-v8=/tmp/libv8-5.9-linux --with-gettext -qmake
如果中间没有出错,可以执行 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 即可。
- Visual Studio 2015
PHP 5.6 SDK for OpenRASP
然后,我们来准备源代码在 Github 克隆或下载源代码
- 下载 php-sdk-5.6.zip,解压到任意位置
- 将
\agent\php 复制为 \vc11\php-5.6.33-src\ext\openrasp 目录
最后,我们开始编译
打开 CMD
# 设置 VS 2015 编译环境 - 将 x86 替换为 x64,即可编译 64 位版本%VS140COMNTOOLS%..\..\vc\vcvarsall.bat x86# 设置 php sdk 依赖环境<php-sdk>\bin\phpsdk_setvars.bat# 进入 php 源代码目录cd <php-sdk>\vc11\php-5.6.33-src# 如果编译过nmake clean# 生成 configure.js 脚本buildconf.bat# 禁用所有模块,只开启 openraspconfigure.bat --disable-all --enable-cli --enable-json --enable-openrasp# 编译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 脚本里打印这个警告:
# ./configure --with-v8=/tmp/libv8 -qconfigure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.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
