OpenJDK的编译
安装环境:CentOS7
。
下载OpenJDK
下载地址:https://hg.openjdk.java.net/jdk/jdk12/
,点击左边的zip。
下载后的包名为jdk12-06222165c35f.zip
,上传至linux的/usr/local目录下,并解压。
# yum install -y unzip 没装的unzip的先安装
# unzip jdk12-06222165c35f
解压后,打开doc/building.xml或doc/building.md学习如何编译,本文也参考这个文档进行的。
下载Oracle JDK
因为OpenJDK的各个组成部分有的是使用C++编译,有的是使用Java自身实现的,所以编译这些Java代码需要一个可用的JDK,官方称这个JDK为“Bootstrap JDK”,所以我使用的版本为:
# java -version
java version "11.0.8" 2020-07-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.8+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.8+10-LTS, mixed mode)
下载地址:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html
。
下载后的包名为jdk-11.0.8_linux-x64_bin.tar.gz
,上传至linux的/usr/local目录下,并解压。
然后配置环境变量:
# vi /etc/profile
最后添加下面两行
JAVA_HOME=/usr/local/jdk-11.0.8
export PATH=$PATH:$JAVA_HOME/bin
然后使用source /etc/profile
刷新配置,使用java -version
命令验证环境变量是否配置成功。
安装扩展依赖
# yum groupinstall -y "Development Tools"
# yum install -y freetype-devel
# yum install -y cups-devel
# yum install -y libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel
# yum install -y alsa-lib-devel
# yum install -y libffi-devel
# yum install -y autoconf
# yum install -y fontconfig-devel
上面的依赖安装完成后,运行configure对编译进行相关配置:
# bash configure --enable-debug --with-jvm-variants=server
如果这一步报错了,根据错误信息安装相关的依赖。
configure的相关参数可以使用bash configure --help
查看,这里列举几个常用的参数:
- –enable-debug:等同于–with-debug-level=fastdebug。
- –with-debug-level:设置编译的级别,可选值为release、fastdebug、slowdebug,默认为release,越往后进行的优化措施越少,带的调试信息越多。
- –with-jvm-variants=[,…]:指定编译模式,可选值为server, client, minimal, core, zero, custom,可以选多个。
- –with-target-bits=:指定编译32位还是64位虚拟机。
安装
运行make
,如果安装失败了,解决错误后要使用make clean
和make dist-clean
清理后再执行make
。
# make
Building target 'default (exploded-image)' in configuration 'linux-x86_64-server-fastdebug'
Compiling 8 files for BUILD_TOOLS_LANGTOOLS
Compiling 19 properties into resource bundles for jdk.compiler
Parsing 2 properties into enum-like class for jdk.compiler
Compiling 13 properties into resource bundles for jdk.javadoc
Compiling 117 files for BUILD_java.compiler.interim
Compiling 396 files for BUILD_jdk.compiler.interim
Compiling 304 files for BUILD_jdk.javadoc.interim
Compiling 162 files for BUILD_TOOLS_JDK
...
...
Warning: No SCM configuration present and no .src-rev
Compiling 4 files for BUILD_JIGSAW_TOOLS
Stopping sjavac server
Finished building target 'default (exploded-image)' in configuration 'linux-x86_64-server-fastdebug'
验证
# cd build/linux-x86_64-server-fastdebug/jdk/bin
# ./java -version
openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.root.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.root.jdk12-06222165c35f, mixed mode)
安装图形界面
# yum groupinstall -y "GNOME Desktop"
# init 5
安装完后最好用root用户登录,不然后面会有一堆权限问题。
安装clion
下载地址:https://www.jetbrains.com/clion/download/#section=linux
。
上传至/usr/local/目录下,并解压:
# tar -zxvf CLion-2020.2.tar.gz
第一次运行clion:
# cd clion-2020.2/bin
# ./clion.sh
第一次运行时会在应用菜单(类似windows的开始菜单)中创建一个快捷菜单,下次运行从快捷菜单进入(不要使用clion.sh,否则之前的配置没有了)。
clion打开后可能会报一个错误Inotify Watches Limit
,根据后面的链接解决:https://confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
。
导入OpenJDK源码
- 打开CLION -> New CMake Project from Sources:
- 然后选择OpenJDK目录/usr/local/jdk12-06222165c35f,然后按默认勾选,点OK:
调试
在右上角,和idea一样的位置,创建一个Cmake Application
Execuable中要选择编译出来的java,对应的目录为/usr/local/jdk12-06222165c35f/build/linux-x86_64-server-fastdebug/jdk/bin。
然后我们把断点打到/usr/local/jdk12-06222165c35f/src/java.base/share/native/libjli/java.c的394行,然后点击debug运行,可以看到进入断点,并且在Debug面板可以看到我们传入的-version参数,如下图所示:
直接继续运行,最终会在控制台看到如下输出:
/usr/local/jdk12-06222165c35f/build/linux-x86_64-server-fastdebug/jdk/bin/java -version
Signal: SIGSEGV (Segmentation fault)
Signal: SIGSEGV (Segmentation fault)
Signal: SIGSEGV (Segmentation fault)
openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.root.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.root.jdk12-06222165c35f, mixed mode)