文章目录

  • 1、前言
  • 2、编译OpenJDK 8
    • 2.1 编译过程
  • 3、生成CodeQL数据库
  • 4、QL查询 - 简单测试
  • 5、小结
  • 参考

1、前言

由于个人需求,想要使用CodeQL对JDK进行代码查询。

按照笔者平时的习惯,为了避免在目标代码库编译和生成CodeQL数据库上浪费时间,笔者多数情况下都会利用 lgtm 来搞定:

  • 方式一:在lgtm上搜索现成的CodeQL数据库。
    方式一用于直接获取代码库最新commit对应的CodeQL数据库。

  • 方式二:如果想要生成代码库指定版本所对应的CodeQL数据库,则先在github上clone一份代码库,然后切换git checkout <tag>切换到指定版本,然后git push到自己的github远程仓库中。接着通过配置 让lgtm集成到你github代码库中,这样lgtm就会对你的代码库启用CodeQL扫描,lgtm扫描后便可在上面下载CodeQL数据库(当然咯,也可以直接在lgtm上面直接进行CodeQL查询,看个人习惯和需要)。如下图:

但是笔者在lgtm上并没有找到 https://github.com/openjdk/jdk8u 可用的CodeQL数据库,具体原因不清楚,可能是lgtm无法通过常规的Java工程编译方式去编译openjdk?暂不细究了。完成目标比较重要。

所以就只能把OpenJDK 8的代码clone下来,自个编译并生成CodeQL数据库。

2、编译OpenJDK 8

其实只要确保代码库编译是没问题的,CodeQL数据库的生成也就没问题了,一条命令的事。

笔者成功编译了OpenJDK 8u1018u322 两个版本。


2.1 编译过程

1、使用docker镜像 ubuntu:16.04 搭建环境。
2、通过apt安装一些常用的命令行程序,以及编译时需要的依赖:

apt install -y build-essential gdb  cmake openjdk-8-jdk cpio file unzip zip wget
&&
apt 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

注:--no-install-recommends选项:使apt不要把推荐的软件作为安装的依赖。

3、上面的依赖安装完后,make程序的版本是4.1,由于该版本在编译OpenJDK 8u101版本时会报各种错误,所以为了简单起见,就干脆都用较低的3.81版本的make。因此从make官方下载3.81版本进行编译安装:

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

安装完后如图:

4、进入OpenJDK源码目录,运行configure进行编译配置和编译环境检查:

# bash configure --with-debug-level=fastdebug  \--with-jvm-variants=server  \--with-boot-jdk=/usr/lib/jvm/java-1.8.0-openjdk-amd64 \--with-target-bits=64 \--enable-debug-symbols  \--with-native-debug-symbols=internal

编译选项可参考官方文档(参考[1])。
简单说一下用到的几个:

  • --with-jvm-variants:编译特定模式的Hotspot JVM虚拟机,这里选择server模式;
  • --with-boot-jdk:这里指定一个已经编译好的JDK路径,这个JDK叫作Bootstrap JDK,且版本至少为N-1。这里我们要编译的是8,所以至少要安装7版本的JDK,不过用8也是可以的,所以上面通过apt安装了openjdk-8-jdk
  • --with-target-bits:选择编译成32位还是64位;
  • --with-native-debug-symbols:符号信息的编译方式,我们选择internal
  • --enable-debug-symbols:启用调试符号信息。

检查通过后,如图:

5、执行make命令开始编译OpenJDK 8。

make images JOBS=4

编译完成后如下图:

3、生成CodeQL数据库

既然OpenJDK编译没问题了,那么生成CodeQL肯定就没问题了。

下载codeql命令行工具(下载地址:https://github.com/github/codeql-cli-binaries/releases)后,在OpenJDK的源码目录下执行如下命令生成CodeQL数据库:

codeql database create openjdk8u322-db  --language=java --command='make images JOBS=4'

:其实codeql生成数据库是在代码库编译的过程中进行的。上面我只是为了确保编译没问题,才先执行的编译。

4、QL查询 - 简单测试

笔者生成了OpenJDK 8u1018u322两个版本的CodeQL数据库。
在VS Code上编写查询简单玩一下:

import javaclass RegistryContext_decodeObject extends Method {RegistryContext_decodeObject() {this.getDeclaringType().hasQualifiedName("com.sun.jndi.rmi.registry", "RegistryContext") and this.getName() = "decodeObject"}
}from RegistryContext_decodeObject m1
select m1

右键执行CodeQL: Run Query On Multiple Databases,执行完成后,在左侧Query HISTORY窗口便能选择查看在不同数据库的查询结果:

可以从com.sun.jndi.rmi.registry.RegistryContext#decodeObject() 方法看8u1018u322版本代码的其中一个区别,没错,就是JDK高版本对JNDI注入的限制。

5、小结

版本稍低的JDK(比如这里的8u101),编译的时候,笔者一开始用的ubuntu:18.04,结果编译的时候各种报错,后来换成3.81版本的make还是不行。为了避免再继续浪费时间,索性用了更低版本的ubuntu,结果顺利进行了编译…

不禁想起不记得在哪里看到的一句话:

Never to wrestle with a pig. You get dirty, and the pig like it.


2022-01-23 更新:
编译好的数据库分享到网盘了:
链接: hxxps://pan.baidu.com/s/1fllcshUXhgHOjq1-edywlg
提取码: s4v8

参考

[1] http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html
[2] https://github.com/openjdk/jdk8u
[3] https://github.com/fnmsd/OpenJDK8-BuildEnv-Docker

编译OpenJDK8并生成CodeQL数据库相关推荐

  1. 在docker上编译openjdk8

    以前曾经试过在VMware上安装linux,再在linux上编译openjdk8,但是每次都不顺利,例如linux环境,预装依赖软件,openjdk源码的选择等环境都会遇到问题,一旦失败再重新开始挺费 ...

  2. 使用Docker编译OpenJDK8

    简介 本文主要介绍如何用docker编译openjdk8. 步骤 1.前置环境 必须安装dokcer环境,然后才能执行下面的操作. 镜像地址: https://github.com/BoYiZhang ...

  3. mysql 4.0.27 下载,CentOS编译Mysql 4.0.27数据库问题解决

    CentOS编译Mysql 4.0.27数据库问题解决以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 现在好多人都用起了 ...

  4. 基于GUI的mcc编译和dll生成

    基于GUI的mcc编译和dll生成 1.mcc的编译 1.1 MCRInstaller编译器的安装 找到Matlab下的MCRInstaller,双击MCRInstaller编译器,运行安装. 1.2 ...

  5. 一个C/C++程序从编译到最终生成可执行文件的全过程分析

    一个C/C++程序从编译到最终生成可执行文件的全过程分析 C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件  1.编译预处理  读取 ...

  6. 根据Word表格自动生成SQL数据库脚本的VBScript代码

    这是几年前写的根据Word表格自动生成SQL数据库脚本的VBScript代码,最近修改了下(原来只支持单个Word表格)使其支持一个Word文档中的多个表格,生成的SQL文件名以Word文件名+.SQ ...

  7. C/C++程序从编译到最终生成可执行文件的过程分析

    转载http://apps.hi.baidu.com/share/detail/32660500 C/C++程序编译步骤 如何生成可执行文件 ***************************** ...

  8. linux 命令读db文件格式,使用linux的db_load命令生成db数据库

    使用linux的db_load命令生成db数据库 发布时间:2020-07-22 10:17:25 来源:亿速云 阅读:113 作者:清晨 栏目:服务器 不懂使用linux的db_load命令生成db ...

  9. Linux下c和cuda混合编译,并生成动态链接库.so和使用

    Linux下c和cuda混合编译,并生成动态链接库.so和使用 2016-08-27 14:27 98人阅读 评论(0) 收藏 举报 分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得 ...

  10. 【i.MX6UL/i.MX6ULL开发常见问题】单独编译内核,uboot生成很多文件,具体用哪一个?...

    [i.MX6UL/i.MX6ULL开发常见问题]2.3单独编译内核,uboot生成很多文件,具体用哪一个? 答:内核编译出来的文件是~/MYiR-imx-Linux/arch/arm/boot/目录下 ...

最新文章

  1. CUDA运行时Runtime(三)
  2. 农行数据中台建设与应用实践
  3. whereis php,Linux命令教程之比较搜索命令whereis与which的区别
  4. 来自lqqm的一些人生感悟,希望从中受益
  5. Sass函数-数字函数-floor()函数
  6. C++ 深浅拷贝 01
  7. java怎么写事件listener_java 事件监听器ActionListener
  8. json对象与字符串互转
  9. 论文Express | 英伟达最新:多模态无监督图像迁移网络框架
  10. spark-shell 基本用法
  11. 使用pyinstaller讲python文件打包成exe文件运行时,弹出命令行界面
  12. 【ARM嵌入式】——多寄存器寻址
  13. 华为荣耀手机连接WiFi失败问题,必须手动开关WiFi才能成功
  14. 【原】[webkit移动开发笔记]之无法自动播放的audio元素
  15. Parallels Desktop 网络初始化失败
  16. 解除同居关系时共同财产的分割
  17. confluence
  18. 【slam十四讲第二版】【课本例题代码向】【第九讲~后端Ⅰ】【安装Meshlab】【BAL数据集格式】【ceres求解BA】【g2o求解BA】
  19. 强连通分量/点双连通分量/边双联通分量 总结
  20. 关于OLED显示屏的理解

热门文章

  1. 【Python】断言(assert)的用法,你真的懂吗?
  2. Tableau计算同比和环比任意天数据
  3. 简单功能强大的jQuery在线图片裁剪插件croppic
  4. 软件测试面试题(等待解答)
  5. mac无法验证您网络上的打印机,怎么解决?
  6. word小技巧 将图片批量居中
  7. ios 苹果支付(IAP)
  8. L2TP iptables nat设置
  9. oracle cude报错,【案例】Oracle报错PLS-00597 PLS-00635原因和解决办法笔记
  10. WordPress网站配置腾讯云cdn缓存