openjdk1.8 安全编译流程

GCC编译选项的全面解释可以参考同行文章:https://blog.csdn.net/eroswang/article/details/1966640?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

好的安全编译选项搭配既能提供程序运行效率,也能提高程序的运行安全性。

安全编译选项 描述 级别
BIND_NOW 立即绑定 high
NX 堆栈不可执行 high
PIC 地址无关 high
PIE 随机化 high
RELRO GOT表保护 high
SP 栈保护 high
NO Rpath/Runpath 动态库搜索路径(禁选) high
FS Fortify Source medium
Ftrapv 整数溢出检查 medium
Strip 删除符号表 mediu

下面我们开始安全编译 openjdk:

1、准备编译环境

名称是:openjdk-8u41-src-b04-14_jan_2020.zip
下载路径:https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-src-b04-14_jan_2020.zip

将文件解压到 /home/jdk/目录下。

提前安装编译依赖环境:

yum groupinstall "Development Tools"
yum install -y libXtst-devel libXt-devel libXrender-devel cups-devel reetype-devel alsa-lib-devel ccache

2、预编译

【NO Rpath/Runpath 选项】/home/jdk/openjdk/common/autoconf/generated-configure.sh 里面有rpath的行,全注释掉

对于其他的安全编译选项,我们需要在 configure 阶段将gcc安全编译选项提前配置到GCC 编译命令中去:

--with-extra-cflags="-fstack-protector-all -fPIC -s -Wl,-z,relro,-z,now,-z,noexecstack"

--with-extra-cxxflags="-fstack-protector-all -fPIC -s -Wl,-z,relro,-z,now,-z,noexecstack"

--with-extra-ldflags='-pie -s -Wl,-z,relro,-z,now,-z,noexecstack '

完整配置命令如下:

./configure --with-target-bits=64 --enable-ccache --with-jvm-variants=server --with-boot-jdk-jvmargs="-Xlint:deprecation -Xlint:unchecked" --with-debug-level=release --with-extra-cflags="-fstack-protector-all -fPIC -s -Wl,-z,relro,-z,now,-z,noexecstack" --with-extra-cxxflags="-fstack-protector-all -fPIC -s -Wl,-z,relro,-z,now,-z,noexecstack" --with-extra-ldflags='-pie -s -Wl,-z,relro,-z,now,-z,noexecstack '

3、开始编译

make JOBS=2 LOG=debug

4、编译完成

编译完成后由于去掉了 rpath 选项,需要将 /home/jdk/openjdk/build/linux-x86_64-normal-server-release/jdk/lib/amd64/jli/libjli.so 软链到 /lib64/libjli.so ,java命令才能正常运行

附上安全编译检查工具:hardening-check   https://download.csdn.net/download/jack85986370/12705664

可执行几个二进制或者动态库的关键配置的校验(如图):

openjdk1.8 安全编译流程_第1张图片

注意:本程序没有配置FS和Ftrapv安全编译选项,原因是会涉及到一些源码的整改。

你可能感兴趣的:(java,jvm)