编译openjdk8
编译环境
- 操作系统:Ubuntu16
- boot jdk:jdk7(我用的是openjdk7)
- 编译的jdk:openjdk8
- 看源码工具:Clion
下载地址:
ubuntu openjdk1.7 openjdk1.8 openjdk1.8源代码
以下编译openjdk的步骤只是其中之一。openjdk 解压后目录下有一个README-builds.html文件,该文件是官方提供的构建步骤,每个环境都有,请大家参考。
构建编译环境
因为OpenJDK的各个组成部分有的是使用C++编译,有的是使用Java自身实现的,比如调试工具:jps、jstat等,还有一些核心jar包,如rt.jar、tools.jar等。所以编译这些Java代码需要一个可用的JDK,官方称这个JDK为“Bootstrap JDK”,所以boot jdk需要比你编译的jdk版本低,因此需要安装jdk1.7。
1.安装启动jdk1.7
# 下载的jdk1.7文件:openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz
## 在usr下创建java目录,将jdk1.7.tar.gz包放到该目录下
mkdir /usr/java
## 解压
tar -xzvf openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz
## 将解压后的文件目录更改为jdk1.7_7u75
mv openjdk-7u75-b13 jdk1.7_7u75
## 在profile文件底部里加入
vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.7_7u75
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
## 退出vi编辑器,使环境变量设置立即生效
## 修改的配置文件载入系统
source /etc/profile
##验证jdk是否安装成功,输出信息证明安装成功
java -version
javac -version
2.安装依赖
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev ccache
3.配置编译
1)解压OpenJDK源码
## 将下载好的openjdk8源码放到/usr/local/openjdk/openjdk8路径下,并解压
###解压.zip文件
unzip openjdk-8u41-src-b04-14_jan_2020.zip
2)配置
## 进入openjdk目录下和configure同一级,执行以下命令
## 配置
sudo bash ./configure --with-target-bits=64 --with-boot-jdk=/usr/java/jdk1.7_7u75 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
说明下第一条命令configure用到的参数作用:
–with-target-bits=64 :指定生成64位jdk; –with-boot-jdk=/usr/java/jdk1.7.0_80/:启动jdk的路径; –with-debug-level=slowdebug:编译时debug的级别,有release, fastdebug, slowdebug 三种级别; –enable-debug-symbols ZIP_DEBUGINFO_FILES=0:生成调试的符号信息,并且不压缩;
执行完命令输出:
看到这个画面就证明配置成功了,就可以编译了
3)编译
## 编译
sudo make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0
执行完命令输出:
看到这个画面就证明编译成功,就可以用了
4)验证
## 进入该目录下
cd build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/
##
./java -version
输出:
调试openjdk8
使用我们编译好的openjdk8(设置环境变量)
进入家目录 cd ~ ,里面有一个.bashrc文件
/home/hcc/.bashrc
是 bash
的配置文件,保存个人的一些个性化设置,如命令别名、路径等。一般会在.bash_profile
文件中显式调用.bashrc
。登陆 linux
启动 bash
时首先会去读取 ~/.bash_profile
文件,这样 ~/.bashrc
也就得到执行了,你的个性化设置也就生效了。
.bash_profile
只在会话开始时被读取一次,而.bashrc
则每次打开新的终端时,都要被读取。
每一次终端连接Linux都会调用这个.bashrc文件,所以把环境变量设置到该文件里
## 打开.bashrc文件设置环境变量
export JAVA_HOME=/home/hcc/CLionProjects/openjdk8/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk
export PATH=$JAVA_HOME/bin:$PATH
##立刻加载修改的文件
source ~/.bashrc
可以看到openjdk版本是我们编译的openjdk8,不是jdk7
证明我们编译的openjdk8能否正常使用?
编写一个Test.java文件,使用我们编译好的openjdk8。
## 1.创建Test.java文件
vim Test.java
## 输入以下代码
public class Test{
public static void main(String[] args){
System.out.print("Hello My custom compile JVM");
}
}
## 2.编译Test.java文件
javac Test.java
## 3.运行Test类,输出Hello My custom compile JVM。证明能够正常使用
java Test
工具调试openjdk8
工具:clion(clion的安装及使用此处省略)
openjdk8源码导入clion
启动clion,选择下面红色框框
到这步完成以后,会帮我们自动创建一个CMakeLists.txt
文件。如果不去修改虚拟机里的代码重新编译,就不用管它。但是发现工程load失败了
所以差了支持包:
###ubuntu运行下面命令:
sudo apt-get install gnustep
sudo apt-get install gnustep-devel
###其他Linux系统(centos)安装运行下面的命令
yum install gcc-objc gcc-objc++ libobjc
重新加载工程, 点击File->Reload Cmake Project,如下不在报错,加载成功,
接下来,编辑配置
全部点击ok后,我们就可以对openjdk源码进行调试了。但是还需要删除Build
要跟踪具体的Java代码在虚拟机中是如何执行的,目前HotSpot在主流的操作系统上,都采用模板解释器来执行字节码,它与即时编译器一样,最终执行的汇编代码都是运行期间产生的,无法直接设置断点,所以HotSpot
增加了以下参数来方便开发人员调试解释器:
## 调试HotSpot时需要加入如下参数
## 当遇到序号为<n>的字节码指令时,便会中断程序执行,进入断点调试,调试 解释器部分代码时,把这两个参数加到Java命令的参数后面即可。
-XX:+TraceBytecodes -XX:StopInterpreterAt=<n>
完成以上配置后,一个可调试的HotSpot工程就完全建立起来了。
HotSpot虚拟机启动器的执行入口是 Java.c 的JavaMain()方法
,可以设置断点单步跟踪。
断点启动
至此,调试openjdk8就完成了。