记一次CodeQL与OpenJDK的联动
夜来风雨声,花落知多少。使用CodeQL为OpenJDK生成数据库,过程中踩了很多坑,写篇博客详细记录一下。CodeQL数据库生成流程CodeQL引擎内的Extractor会对程序中的语义信息进行分析与提取,用来构建后续用来分析的数据库。编译型语言:在本地编译的过程中,可以将Extractor视作探针。它监视编译过程,捕获程序语义信息。解释性语言:直接分析程序源码。数据库里有什么:源代码src.z
夜来风雨声,花落知多少。
使用CodeQL为OpenJDK生成数据库,过程中踩了很多坑,写篇博客详细记录一下。
CodeQL数据库生成流程
CodeQL引擎内的 Extractor
会对程序中的语义信息进行分析与提取,用来构建后续用来分析的数据库。
编译型语言:在本地编译的过程中,可以将 Extractor
视作探针。它监视编译过程,捕获程序语义信息。
解释性语言:直接分析程序源码。
数据库里有什么:源代码 src.zip
、语义信息、关系数据。
CodeQL数据库获取途径
LGTM平台 对CodeQL做了非常好的数据支持,不仅可以在上面直接编写QL脚本查询,还可以下载到特定组件对应的数据库。
当然,LGTM也支持与用户的GitHub仓库联动的Workflow,具体操作看参考 官方文档 。
但痛点是,LGTM平台并没有OpenJDK的Database。。。
为了解决它,我去 openjdk/jdk8u 项目找到对应版本的tag,本地编译了一下,也就有了这篇博客。
过程记录
编译环境
操作系统:ubuntu 16.04
Boot_JDK:jdk 1.7.0_80
Target_OpenJDK:OpenJDK 8u73
准备Boot_JDK
我选择的是直接解压 tar.gz
方式进行Boot_JDK的安装, jdk-7u80-linux-x64.tar.gz
# 解压 mkdir /usr/lib/jvm tar -zxvf jdk-7u80-linux-x64.gz -C /usr/lib/jvm # 配置环境变量 vim ~/.bashrc export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_80 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH # 环境变量生效 source ~/.bashrc # 配置系统默认的JDK版本 update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_80/bin/java 300 update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_80/bin/javac 300 update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.7.0_80/bin/jar 300 update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/jdk1.7.0_80/bin/javah 300 update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk1.7.0_80/bin/javap 300 update-alternatives --config java # 检查是否配置成功 java -version
准备Toolchain
软件包更新:
apt-get update apt-get upgrade
安装编译工具:
apt-get install -y build-essential gdb cmake cpio file unzip zip wget ccache
apt-get install -y --no-install-recommends libfontconfig1-dev libfreetype6-dev libcups2-dev libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev libasound2-dev libffi-dev autoconf
降级cmake到3.81版本:
cd ~/OpenJDK8u73 wget http://ftp.gnu.org/gnu/make/make-3.81.tar.gz && tar -zxvf make-3.81.tar.gz && cd make-3.81 && bash configure -prefix=/usr && make && make install # 查看cmake版本 cmake -v
OpenJDK编译环境检查:
chmod 777 configure ./configure --with-target-bits=64 --with-boot-jdk=/usr/lib/jvm/jdk1.7.0_80 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
当你看到这个画面,恭喜你,你的编译环境没问题:
编译&数据库生成
到这里,下面这行命令就可以编译了:
make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0
但我们想要的是CodeQL数据库,所以需要改一下命令:
codeql database create Openjdk8u73_db --language="java" --command="make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0"
编译成功之后,cd到 build/linux-x86_64-normal-server-slowdebug/jdk/bin
目录下:
编译好的OpenJDK在build目录下,对应的CodeQL数据库在源码目录下:
CodeQL查询
有了Database,导入到VSCode插件中,写个脚本简单查询一下:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)