编译 OpenJDK
关于编译 OpenJDK 官方文档有很好的介绍,https://openjdk.java.net/groups/build/。编译 JDK 8 需要 Xcode 4,当前最新的 Xcode 版本已经是 9.0,前人尝试编译发现有很多坑 [ doc ],所以本文直接开始尝试编译 OpenJDK 9。OpenJDK 9 源码根目录下的 README 文件有如下提示信息(github, hg):
1 | For information about building OpenJDK, including how to fully retrieve all |
common/doc/building.html 和 common/doc/building.md 就是本文的主要参考来源。
长话短说 TL;DR
building.md 首先给如下的 [TL;DR]:
1 | $ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9 |
现在就按照,这个几个命令尝试。
注意,如果运行 bash get_source.sh
时出现类似以下错误,是网络问题造成,多运行几次 bash get_source.sh
,直到不出现错误为止。
1 | WARNING: langtools exited abnormally (255) |
若不想使用 hg clone
加 get_source.sh
下载全部源代码,可以从 OpenJDK 的 github 镜像(非官方)下载:
1 | $ git clone https://github.com/openjdk/jdk9 |
或者直接下载 zip 文件:
1 | wget -O jdk-9+180.zip https://hg.openjdk.java.net/jdk9/jdk9/archive/jdk-9+180.zip |
下载好全部源代码后,接下来需要运行 bash configure
,控制台最后输出:
1 | ··· 省略 |
可以看到 Debug level: release
,除了默认的 release
,还有 fastdebug
, slowdebug
和 optimized
这三个调试级别 [ doc ]。现在试试 slowdebug
这个调试级别:
1 | $ bash configure --with-debug-level=slowdebug |
现在开始编译这个 OpenJDK,运行 make images
。但是会报如下的编译错误:
1 | /Users/yulewei/jdk9/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp:167:12: error: instantiation of variable 'TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::_min_tree_chunk_size' required here, but no definition is available [-Werror,-Wundefined-var-template] |
对个这个编译错误,configure
命令后需要添加的 --disable-warnings-as-errors
[ doc, mail.openjdk ],即将原先的命令修改为:
1 | $ bash configure --disable-warnings-as-errors --with-debug-level=slowdebug |
但依然报错,如下:
1 | /Users/yulewei/jdk9/hotspot/src/share/vm/memory/virtualspace.cpp:585:14: error: ordered comparison between pointer and zero ('char *' and 'int') |
使用 Google 搜索这个编译错误,发现 OpenJDK 官方早就有人提了相关 bug,JDK-8174050 和 JDK-8187787。至于如何修改,可以参考,hg 316854ef2fa2 或这 git 镜像 a05122a。
这个错误是 XCode 版本不一致造成的,笔者机器运行的版本是 9.0,clang 9.0,而文档上说 Mac 下 JDK 9 的代码是用 XCode 8.3.2 和 --disable-warnings-as-errors
编译成功的 [ doc ]。
1 | $ clang --version |
使用这个补丁 patch,修改这 3 个 cpp 文件代码:
1 | wget -O jdk-8174050.patch https://github.com/openjdk/jdk/commit/19af6364825a401c281e9831f892a033a6f597e8.patch |
重新运行 configure
和 make
,不出意外的话,就可以编译成功。等待十几分钟后,最后一行输出:
1 | ... 省略 |
全部编译结果都在 build/macosx-x86_64-normal-server-slowdebug
目录下。来验证下:
1 | $ build/macosx-x86_64-normal-server-slowdebug/jdk/bin/java -version |
命令小结
编译 debug 版 OpenJDK 需要的命令:
1 | $ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9 |
阅读和调试 HotSpot 代码
我们使用 slowdebug
编译了 jdk 源代码,build 目录下会生成 java.dSYM
、javac.dSYM
、libjava.dylib.dSYM
、libjvm.dylib.dSYM
等调试信息文件。有这些调试信息文件,就可以用 gdb
或者 lldb
调试 HotSpot 了。
1 | lldb --version |
使用 CLion
使用命令行工具太原始了,CLion 下阅读和调试更加方便。但是 CLion 目前只支持 cmake,不支持 make 项目。Google 下,发现 JDK 10 下有个官方分支 JDK-8177329-cmake-branch,能生成 CMakeLists.txt
[ mail, README-cmake.md ],但博主尝试生成 CMakeLists.txt
,失败了。只好退而求其次,使用简单的 CMakeLists.txt
文件,好让 CLion 能语法索引整个 HotSpot 项目,方便在 CLion 下阅读代码。CMakeLists.txt
文件如下:
1 | cmake_minimum_required(VERSION 3.7) |
参考资料
- Building OpenJDK https://github.com/openjdk/jdk9/blob/master/common/doc/building.md
- 2018-01 自己动手,在macOS High Sierra中编译一个可debug的JDK https://juejin.im/post/5a6d7d106fb9a01ca47abd8b
- openjdk code compilation/ IDE setup https://stackoverflow.com/a/44522565