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
可执行几个二进制或者动态库的关键配置的校验(如图):
注意:本程序没有配置FS和Ftrapv安全编译选项,原因是会涉及到一些源码的整改。