俗话说:一千个读者眼中有一千个哈姆雷特,一千个人编译 OpenJDK 会出现一千种错误……

这篇文章没什么技术含量,只是记录一下怎样成功编译出 OpenJDK,不枉费这么多天的挣扎……

安装依赖

我的系统是 Manjaro,内核为 x86_64 Linux 4.9.65-1-MANJARO。

  • Mercurial: 下载代码用
  • OpenJDK 7: 用作 Bootstrap JDK
  • GCC 4.9: 用 GCC 7.2 编译会 SEGFAULT,换个相对老一点的。把对应的 binary 软链到 /usr/bin/gcc49/gcc/usr/bin/gcc49/g++

可能还有一些没注意到的,我机器上本来就有的依赖,就按照 configure 时候的提示安装吧。

下载代码

这里使用的是稳定版的 jdk8u,先将仓库 clone 下来。

1
$ hg clone http://hg.openjdk.java.net/jdk8u/jdk8u

然后再执行仓库内的脚本把每个组件的代码下载下来。

1
2
$ cd jdk8u
$ bash get_source.sh

编译 OpenJDK

先要去 hotspot/make/linux/makefiles/gcc.make 里把 WARNINGS_ARE_ERRORS 那行注释掉,不然会遇到警告编译不过。

这是我用的配置:

1
2
$ bash ./configure --with-debug-level=fastdebug --with-target-bits=64 --with-boot-jdk=/usr/lib/jvm/java-7-openjdk --with-tools-dir=/usr/bin/gcc49
$ make all

然后就编译出 fastdebug 配置的 OpenJDK 8 了。在 build/linux-x86_64-normal-server-fastdebug/jdk 里可以找到编译出来的 JDK。

在 Eclipse 里调试

在 Eclipse (C++ 版) 里用 Makefile Project with Existing Code 创建项目,Existing Code Locationhotspot 目录,ToolchainLinux GCC

Debug Configurations 里新建一个配置,将 Application 路径设为 build/linux-x86_64-normal-server-fastdebug/jdk/bin/java,然后选择 Disable auto build

Argument 选项卡里配置 java 的命令行参数,在 Environment 选项卡里设置好 CLASSPATH

Debugger 选项卡的 GDB command file 里设置额外的 .gdbinit,其中的内容设为:

1
handle SIGSEGV pass noprint nostop

因为 JVM 内部会使用 SIGSEGV 作为正常信号,而调试器默认会捕获它。我们用这条配置来忽略。

然后就可以开始 Debug 了。